我在 UNIX 中使用 sprintf()
将 double
值转换为字符串时遇到一个特定问题。
例如我有两个值:
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”表示为精确值的任何常用方法。
最佳答案
打印 b 时得到零是因为您告诉 printf 打印小数点后 15 位 (%.15f
),它会乖乖地这样做。要获得“精确”的东西,使用简单的 %g
可能会更好。
[根据最近的评论更新]
事情真的取决于你所说的“精确”是什么意思。如果确切地说,您的意思是“用户最初输入的内容”,那么 double 可能不是您的最佳选择。也许将值存储为字符串,然后在需要在计算中使用它时将其转换为 double 可能会奏效。一旦将基于文本的十进制数转换为 double ,它通常不再与文本完全相同。虽然 printf()
或 ostream
会尽职尽责地打印出 double 包含的内容(有时它很幸运,它打印的内容看起来与原始值相同),但问题是double 本身不再具有实际的原始值。事实上,它从来没有。
或者,您可能更喜欢精确的数字实现,而不是像 double 那样本质上近似的东西。例如,MySQL 有 NUMERIC and DECIMAL以强制您提前指定整数和小数位数为代价的支持完美精度的类型。这叫做 arbitrary precision arithmetic并且有用于在 C/C++ 中执行此操作的库。
关于c++ - 双值的 sprintf 格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10328150/