c++ - 双值的 sprintf 格式化

标签 c++ c unix printf

我在 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/

相关文章:

c++ - 从字符串 vector 初始化二维数组的最简单方法是什么?

c++ - 需要在 C++ 中获取 CString 数组的大小

将长值转换为日期?

c - 我需要创建一个循环来找到最年长的学生并打印他的 ID

c - 与消息队列相关的问题

c++ - 安装? linux屏幕后面有什么?

c++ - 重新定义 uint 类型 c++

c - 如何在文件名中使用索引

删除冒号之前的所有文本

c - 如何为多个进程实现管道?