首页 > 解决方案 > 为什么 printf 输出浮点 1.45 有一位小数,而 1.445 有两位小数在不同的行为中?

问题描述

printf("%.1f, %.2f", 1.45, 1.445);

输出

1.4, 1.45

1.45 是切片的,但 1.445 是四舍五入的。

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

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

标签: c++cfloating-pointspecifications

解决方案


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

如果您将它们打印到荒谬的精确度,那么真相就会出现:

#include <stdio.h>
printf("%20.20f, %20.20f", 1.45, 1.445);

结果:

1.44999999999999995559, 1.44500000000000006217

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

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


推荐阅读