【发布时间】:2020-09-26 08:34:52
【问题描述】:
为什么下面的 printf 打印的是 123456.984 而不是 123456.988?
#include <stdio.h>
int main()
{
printf("%.3f\n", 123456.987654);
return 0;
}
编辑:我做错了,正确的 printf 是:
printf("%.3f\n", 123456.987654f);
【问题讨论】:
-
也许
123456.984是123456.987654的最接近(四舍五入)近似值?参见例如Is floating point math broken?了解详情。 -
@Someprogrammerdude: 不,
123456.987654是double,C 标准要求double具有足够的精度以产生“123456.988”。 (DBL_DIG必须至少为 10,因此任何 10 位有效数字十进制数都可以四舍五入为double并再次返回而无需更改。) -
问题中当前显示的代码在 macOS 10.14.6 上使用 Apple Clang 11.0.0 输出“123456.988”,我希望它也可以在其他常见的 C 实现中使用。您使用的是什么编译器、编译器版本、编译器标志/开关和操作系统?为确保这是生成所述输出的代码,请删除可执行文件,尝试执行它以确保它已消失,然后从头开始重建它。
-
@EricPostpischil 在this 评论之前的问题中,OP 声明他/她在 Windows 下使用带有 MingW-gcc 的 Code::Blocks。可能这就是她/他的设置。
-
在没有来自 OP 的进一步信息和编辑的情况下,这应该被关闭,因为不可复制。问题中显示的代码不会产生正确的 C 实现中要求的输出。 OP 可能有打印
float对象或常量的代码,这可以解释输出,但目前提出的问题似乎不正确。
标签: c floating-point printf double precision