我一直在阅读一本书《编写高质量代码:深入计算机理解内部原理》。在关于四舍五入的章节中,它说:
但是当我用Python尝试这个操作时:
输出结果如下:
但是为什么会出现这种情况呢?
我的假设是,浮点数单元在应用程序员的舍入之前,将额外的位四舍五入,将"1.4999999999999999999"转换为"1.5"。
这意味着:如果小数位的值大于或等于可以表示的总小数值的一半,则应将数字舍入到最小的更大数字。
round(1.5) // equals 2
round(1.49) // equals 1
但是当我用Python尝试这个操作时:
x1 = 1.4999 # rounds to 1
x2 = 1.4999999999999999 # rounds to 2
print(round(x1))
print(round(x2))
输出结果如下:
我尝试使用C#和Swift进行相同的操作,结果也一样。因此我认为这是一个与语言无关的主题。1
2
但是为什么会出现这种情况呢?
我的假设是,浮点数单元在应用程序员的舍入之前,将额外的位四舍五入,将"1.4999999999999999999"转换为"1.5"。
1.4999999999999999999
这个数不是浮点数能够单独表示的数字,与1.5
相区分。浮点数是实数的近似值。 - Martijn Pieters1.5
。1.4999999999999999 == 1.5
是True
。如果去掉一个9
,你会看到你期望的行为:略小于 1.5 的数字确实被舍入为向下取整。 - John Kugelman