为什么四舍五入浮点数1.4999999999999999会产生2?

时间:2019-04-28 12:43:15

标签: python floating-point language-agnostic rounding

我一直在读一本书Write Great code - Understanding the Machine。在有关四舍五入的部分中说:

  

如果小数位的值大于或等于可表示的总十进制值的一半,则数字应四舍五入为最小的大数。

这意味着:

public Quaternion MyGameObjectRotation;

但是当我尝试使用Python时:

round(1.5) // equals 2
round(1.49) // equals 1

输出为:

  

1

     

2

我用C#和Swift尝试了同样的事情,并且给出了相同的输出。因此,我认为这是一个与语言无关的话题。

但是为什么会这样?

我的假设是,浮点单元将多余的位四舍五入,从而在应用程序员的四舍五入之前将“ 1.49999999999999999999999”转换为“ 1.5”。

1 个答案:

答案 0 :(得分:7)

x2 = 1.4999999999999999print(round(x2))中,有两个操作会影响该值。 round功能不能直接在数字1.4999999999999999或数字“ 1.4999999999999999”上运行。其操作数必须采用Python实现使用的浮点格式。

因此,首先,将1.4999999999999999转换为浮点格式。 Python并不严格要求Python实现使用哪种浮点格式,但是IEEE-754基本的64位二进制格式很常见。在这种格式下,最接近1.4999999999999999的可表示值是1.5和1.49999999999999999779553950749686919152736663818359375。前者比后者更接近1.4999999999999999,因此使用前者。

因此,将1.4999999999999999转换为浮点格式将产生1.5。然后round(1.5)产生2。