sprintf格式化double值

san*_*ndy 5 c c++ unix printf

在UNIX 中将double值转换为字符串时,我有一个特定的问题sprintf().

例如,我有两个值:

double a = 0.009984354523452;
double b = 0.01;
Run Code Online (Sandbox Code Playgroud)

转换时,我正在使用:

sprintf(somestringvar, "Double value : %.15f \n", a);
sprintf(diffstringvar, "Double value : %.15f \n", b);
Run Code Online (Sandbox Code Playgroud)

转换为字符串.

我的问题是'a',值正确打印但是对于'b'的值,在尾端附加0.请提供任何常用的方法来表示'a'和'b'作为确切的值.

Ran*_*ook 8

打印b时得到零,因为你告诉printf打印15个小数位(%.15f),并且乖乖地这样做.要获得"精确"的东西,你可能会有更好的运气%g.


[根据最近的评论更新]

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

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