底数除法// vs int()四舍五入

时间:2018-09-08 03:33:41

标签: python floating-point int rounding floor-division

我是Python 3.6.0的新用户。我正在尝试将2个数字相除,从而产生较大的输出。但是,使用

return ans1 // ans2

使用时会产生55347740058143507128

return int(ans1 / ans2)

产生55347740058143506432。

哪个更准确?为什么呢?

2 个答案:

答案 0 :(得分:6)

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

第二个代表中间结果为浮点数。浮点数的分辨率有限(53 bits of mantissa),而结果需要66位才能准确表示。这会导致准确性下降。

如果我们看一下两个结果的十六进制表示形式:

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

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

一种直接查看四舍五入而不造成除法复杂性的方法是:

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

答案 1 :(得分:3)

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

此结构int(ans1 / ans2)的问题在于,结果临时为浮点数(显然,将其转换为整数之前),并向最接近的浮点数取整(取整量取决于的大小)。号码)。甚至可以通过尝试通过浮点数将该值四舍五入来看到这一点:

print(int(float(55347740058143507128)))

打印55347740058143506432。因此,由于普通/会导致浮点运算,因此会限制其准确性。