【发布时间】:2012-10-12 19:11:21
【问题描述】:
出于货币数量和价格的目的,我正在研究用 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();
}
我真的在追求更好的东西,再加上一轮(以特定的精度)来四舍五入(请原谅双关语)
【问题讨论】:
-
据此(不确定它的信誉如何 - 它来自 2006 年),
decimal应该支持重载流运算符:open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1977.html。也许 g++ 还没有?