我使用 //
偶然发现了 python 3 的“地板划分”的奇怪边缘行为。经过一些计算,我得出公式 (a1 - a2)//b
。使用
a1 = 226.72560000000001
a2 = 0.2856000000000165
b = 1.02
# all types are np.float64
我得到的结果与使用np.floor()
时不同:
>>> (a1 - a2) // b
221.0
>>> np.floor((a1 - a2) / b)
222.0
这种差异显然源于浮点计算,但为什么它们的行为不同呢?使用更高精度的计算器,例如 ke!san我可以验证 //
的行为在数学上是正确的,而对于我的计算,np.floor()
将提供正确的结果。
最佳答案
确实 //
结果在数学上是正确的。
但是如果你只是执行 (a1 - a2)/b
你可以看到结果已经四舍五入为 222.0
(由于浮点存储限制,它应该是改为 221.9999999999999936275
),因此现在使用 Floor 将返回 222.0
。
编辑:实际上对于//
,首先a1-a2四舍五入为226.44
(而不是226.4399999999999935
),然后226.44//由于 @Talha Tayyab 的解释(x//y 返回 (x-x%y)//y),1.02
错误地返回 221
而不是 222
。< br/>
因此存在两个连续的舍入误差,它们相互补偿并得到正确的结果。
关于python - 为什么 a//b 和 np.floor(a/b) 产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76769996/