我正在研究用 g++ 的 std::decimal::decimal32/64/128 类型替换我们的代码中的双精度,以达到货币数量和价格的目的,但是我陷入了如何最好地输入和输出的问题上数据。具体来说,似乎没有任何用于与字符串进行转换的例程,并且字符串流机制不会针对这些类型进行编译。我看到这样做的唯一方法是使用 double 作为中间类型,但是如果我们总是通过双精度输入和输出,这肯定至少部分违背了使用小数类型的目的?
我确定我在这里不了解某些内容,因此欢迎就如何最好地使用这些类型提供一些反馈。
编辑:
我已经破解了几个输入/输出例程,但是我对任何一个都不满意。输入几乎没有鲁棒性(不支持科学记数法),输出例程过于简单,更不用说由于双重转换而导致的低效。
#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();
}
我真的对这两个方面都有更好的追求,再加上一轮(以特定的精度)来四舍五入(请原谅双关语)