Я изучаю замену двойников в нашем коде на g++ std:: decimal:: decimal32/64/128 типов для целей сумм валют и цен, однако я зацикливаюсь на том, как наилучшим образом вводить и выводить данные. В частности, не существует каких-либо подпрограмм для преобразования в/из строки, а механизмы stringstream не компилируются для этих типов. Единственный способ, которым я это вижу, - использовать double в качестве промежуточного типа, однако, конечно, это, по крайней мере, частично поражает цель использования десятичных типов, если мы всегда вводим и выводим через двойники?
Я уверен, что я не понимаю что-то здесь, так что бы приветствовать некоторые отзывы о том, как лучше использовать эти типы.
Edit:
Я взломал пару процедур ввода/вывода, но я тоже не очень доволен. Ввод вряд ли является надежным (без поддержки научной нотации), а процедура вывода упрощена, не говоря уже о неэффективности из-за двойного преобразования.
#define MAX_DEC_LEN 17
std::decimal::decimal64 FromString(const char* str)
{
if (strlen(str) > MAX_DEC_LEN)
throw std::runtime_error("bad input");
char buf[MAX_DEC_LEN+1];
strncpy(buf, str, MAX_DEC_LEN+1);
char* point(NULL);
if ((point = strchr(buf, '.')) != NULL)
*(point++) = '\0';
std::decimal::decimal64 ret(atoi(buf));
if (point != NULL && *point != '\0')
{
int exponent(strlen(point));
long long unsigned coeff(atoi(point));
std::decimal::decimal64 d2(std::decimal::make_decimal64(coeff, -exponent));
if (*buf == '-')
ret -= d2;
else
ret += d2;
}
return ret;
}
std::string ToString(std::decimal::decimal64 dec)
{
double d(std::decimal::decimal_to_double(dec));
std::ostringstream oss;
oss << std::fixed << std::setprecision(6) << d;
return oss.str();
}
Я действительно обойдусь чем-то лучше для обоих из них, плюс круглый (с определенной точностью), чтобы округлить вещи (простить каламбур)