Why round(1.4999999999999999) = 2?



我想知道为什么

round(1.499999999999999)
1

round(1.4999999999999999)
2

如果我想在python控制台中打印,1.499999999999999打印为1.499999999999999,1.4999999999999999打印为1.5

也例如1 / 3被打印为0.3333333333333333(小数点后有16位数字),小数点后的16位数字是最大数字量,或者它的存储方式不同,它在python中是如何打印的?

From float Point Arithmetic: Issues and limits Representation Error in The Python Tutorial:

今天(2000年11月)几乎所有的机器都使用IEEE-754浮点算法,几乎所有的平台都将Python浮点数映射到IEEE-754"双精度"。754个双精度数包含53位精度,因此在输入时,计算机努力将0.1转换为最接近的形式J/2**N,其中J是包含53位的整数。

您的Python实现可能使用IEEE 754标准来表示数字,其中松散地说,所有数字(NaN和infinity除外)都表示为

x = f * 2^e

其中fe(你可以把它们看作小数部分和指数)是整数。


在本例中:

  • 1.499999999999999表示为0x3FF7FFFFFFFFFFFB

    对应于6755399441055739*2^-52即1.4999999999999988897769753748434595763683319091796875

  • 1.4999999999999999表示为0x3FF8000000000000

    对应于6755399441055744*2^-52正好是1.5。

1.4999999999999999在Python中表示为1.5的原因是1.5是IEEE 754中可以表示的最接近1.4999999999999999的值。


由于标准只表示有限数量的值(它有效地将实数线离散为固定数量的点),当一个数字不恰好位于这些点之一时,必须做出妥协。

1.499999999999999夹在可以在IEEE 754中表示为的两个数字之间-您可以将其视为

  • 6755399441055739*2^-52 == 1.499999999999999988897769753748434595763683319091796875
  • 6755399441055739.496400372629504*2^-52 = 1.4999999999999999999
  • 6755399441055740*2^-52 == 1.4999999999999999911182158029987476766109466552734375

6755399441055739*2^-52最接近1.499999999999999(注意,小数部分小于0.5,因此选择四舍五入)。

同样,1.4999999999999999被夹在两个数字之间,可以在IEEE 754中表示为-您可以将其视为
  • 6755399441055743*2^-52 == 1.4999999999999997779553950749686919152736663818359375
  • 6755399441055743.5496400372629504*2^-52 = 1.49999999999999999999

6755399441055744*2^-52最接近1.499999999999999999(注意小数部分大于0.5,因此选择四舍五入),因此选择等效于1.5的IEEE 754表示。


回答你的问题,结果是

round(1.499999999999999)
1

round(1.4999999999999999)
2

因为第二个语句在功能上与

相同
round(1.5)
2

由于1.49999999999999991.5被视为相同-您可能可以通过执行类似

的操作来确认这一点
1.4999999999999999 == 1.5

注意:我要强调的是,这取决于你正在运行的Python实现,实现IEEE 754的浮点数。

这是因为python没有那么精确,所以1.49999999999999999999999999999 = 1.5 ->圆(1.5)= 2如果你想了解更多,请访问https://docs.python.org/3/tutorial/floatingpoint.html

对于更精确计算的数学库可以有所帮助,例如:0.1 + 0.1 + 0.1…= 1, python是0.999999999999,所以try
print(math.fsum([0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]))

相关内容

  • 没有找到相关文章

最新更新