我是Python 3.6.0的新用户。我试图划分2个产生大量输出的数字。但是,使用
return ans1 // ans2
使用时产生55347740058143507128
return int(ans1 / ans2)
生产55347740058143506432。
哪个更准确,为什么会这样?
第一个更准确,因为它给出了精确的整数结果。
第二个表示浮动的中间结果。浮点数的分辨率有限(53 bits of mantissa),而结果需要66位才能准确表示。这导致精度损失。
如果我们查看两个结果的十六进制表示:
>>> hex(55347740058143507128)
'0x3001aac56864d42b8L'
>>> hex(55347740058143506432)
'0x3001aac56864d4000L'
我们可以看到,不适合53位尾数的结果的最低有效位都被设置为零。
直接看到舍入的一种方法是,没有任何由分裂引起的复杂化是:
>>> int(float(55347740058143507128))
55347740058143506432L
从这个意义上讲,地板整数除法更准确。
这个构造int(ans1 / ans2)
的问题是,结果暂时是浮点(显然,在转换为整数之前),将舍入引入最近的浮点数(舍入量取决于数字的大小)。这甚至可以通过试图通过浮点数往返该值来看出:
print(int(float(55347740058143507128)))
打印55347740058143506432
。因此,因为普通的/
导致浮动,这限制了它的准确性。