我是Python 3.6.0的新用户。我试图除以两个数,但结果很大。然而,使用
return ans1 // ans2
使用时会产生55347740058143507128
return int(ans1 / ans2)
生成了55347740058143506432。
哪个更准确,为什么呢?
我是Python 3.6.0的新用户。我试图除以两个数,但结果很大。然而,使用
return ans1 // ans2
使用时会产生55347740058143507128
return int(ans1 / ans2)
生成了55347740058143506432。
哪个更准确,为什么呢?
第一个结果更精确,因为它给出了精确的整数结果。
第二个结果将中间结果表示为浮点数。浮点数具有有限的分辨率(53位尾数),而结果需要66位才能精确表示。这导致了精度损失。
如果我们查看两个结果的十六进制表示:
>>> hex(55347740058143507128)
'0x3001aac56864d42b8L'
>>> hex(55347740058143506432)
'0x3001aac56864d4000L'
>>> int(float(55347740058143507128))
55347740058143506432L
在这方面,使用向下取整的整数除法更加准确。
使用 int(ans1 / ans2)
这种写法会导致结果暂时变成一个浮点数(在转换为整数之前),引入了接近浮点数的舍入误差(舍入误差大小取决于数字的数量级)。这甚至可以通过尝试将该值通过浮点数来round-trip进行验证:
print(int(float(55347740058143507128)))
这段代码打印出 55347740058143506432
。因为普通的/
会返回浮点数,这会限制精确度。
repr(ans1)
和repr(ans2)
并发布结果吗? - zneak