分区// vs int()四舍五入

问题描述 投票:2回答:2

我是Python 3.6.0的新用户。我试图划分2个产生大量输出的数字。但是,使用

return ans1 // ans2

使用时产生55347740058143507128

return int(ans1 / ans2)

生产55347740058143506432。

哪个更准确,为什么会这样?

python floating-point int rounding floor-division
2个回答
6
投票

第一个更准确,因为它给出了精确的整数结果。

第二个表示浮动的中间结果。浮点数的分辨率有限(53 bits of mantissa),而结果需要66位才能准确表示。这导致精度损失。

如果我们查看两个结果的十六进制表示:

>>> hex(55347740058143507128)
'0x3001aac56864d42b8L'
>>> hex(55347740058143506432)
'0x3001aac56864d4000L'

我们可以看到,不适合53位尾数的结果的最低有效位都被设置为零。

直接看到舍入的一种方法是,没有任何由分裂引起的复杂化是:

>>> int(float(55347740058143507128))
55347740058143506432L

3
投票

从这个意义上讲,地板整数除法更准确。

这个构造int(ans1 / ans2)的问题是,结果暂时是浮点(显然,在转换为整数之前),将舍入引入最近的浮点数(舍入量取决于数字的大小)。这甚至可以通过试图通过浮点数往返该值来看出:

print(int(float(55347740058143507128)))

打印55347740058143506432。因此,因为普通的/导致浮动,这限制了它的准确性。

© www.soinside.com 2019 - 2024. All rights reserved.