sprintf格式化double值

时间:2012-04-26 06:16:24

标签: c++ c unix printf

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

例如,我有两个值:

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'作为确切的值。

1 个答案:

答案 0 :(得分:8)

在打印b时你得到零,因为你告诉printf要打印15个小数位(%.15f),并且它是顺从地这样做的。为了获得“精确”的内容,您可以通过简单的%g获得更好的运气。


[根据最近的评论更新]

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

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