为什么 printf 输出浮动 1.45 保留一位小数,而 1.445 保留两位小数在不同的行为中?

Zha*_*ang 4 c c++ floating-point specifications

printf("%.1f, %.2f", 1.45, 1.445);
Run Code Online (Sandbox Code Playgroud)

输出

1.4、1.45

1.45 被切片但 1.445 被四舍五入。

我发现了这个, 为什么 printf 舍入浮点数? 这解释了规范建议对浮动进行四舍五入。

编辑:我使用 VS2017(在 C++ 项目中)和 Dev-C 对其进行了测试。

Jer*_*fin 8

[编辑:我最初没有将它们打印到足够荒谬的精度水平,所以答案给出了结果背后的错误推理。]

如果您将它们打印到可笑的精确度,真相就会浮出水面:

#include <stdio.h>
printf("%20.20f, %20.20f", 1.45, 1.445);
Run Code Online (Sandbox Code Playgroud)

结果:

1.44999999999999995559, 1.44500000000000006217
Run Code Online (Sandbox Code Playgroud)

因此,转换后,1.45 最终会比 1.45一点,而 1.445 最终会稍微大于1.445。

所以,当然,当我们取整 1.45 时,它会向下取整,但是当我们取整 1.445 时,它会向上取整。