5

在 UNIX 中double使用将值转换为字符串时,我遇到了一个特定问题。sprintf()

例如我有两个值:

double a = 0.009984354523452;
double b = 0.01;

转换时,我正在使用:

sprintf(somestringvar, "Double value : %.15f \n", a);
sprintf(diffstringvar, "Double value : %.15f \n", b);

转换为字符串。

我的问题是'a',该值打印正确,但对于'b'的值,尾端附加了0。请提供任何将“a”和“b”表示为精确值的常用方法。

4

1 回答 1

8

打印 b 时会得到零,因为您告诉 printf 打印小数点后 15 位 ( %.15f),并且它很乖巧地这样做了。要获得“准确”的信息,您可能会使用 simple 获得更好的运气%g


[根据最近的评论更新]

事情真的取决于你所说的“确切”。如果确切地说,您的意思是“用户最初输入的内容”,那么双精度可能不是您的最佳选择。也许将值存储为字符串,然后在需要在计算中使用它时将其转换为双精度值可能会起作用。一旦基于文本的十进制数转换为双精度数,它通常不再与文本完全相同。虽然printf()orostream会尽职尽责地打印出 double 所持有的内容(有时它很幸运,并且它打印的内容看起来与原始值相同),但问题是 double 本身不再持有实际的原始值。事实上,它从来没有这样做过。

或者,您可能更喜欢精确的数字实现,而不是像双精度数这样的固有近似值。例如,MySQL 具有支持完美精度的NUMERIC 和 DECIMAL类型,但代价是强制您提前指定整数和小数位数。这称为任意精度算术,并且在 C/C++ 中有用于执行此操作的库。

于 2012-04-26T06:19:58.703 回答