我想知道为什么
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
其中f
和e
(你可以把它们看作小数部分和指数)是整数。
在本例中:
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.4999999999999999
和1.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]))