3

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

return ans1 // ans2

使用时产生 55347740058143507128

return int(ans1 / ans2)

产生 55347740058143506432。

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

4

2 回答 2

7

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

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

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

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

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

直接查看舍入的一种方法是:

>>> int(float(55347740058143507128))
55347740058143506432L
于 2018-09-08T03:49:14.067 回答
3

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

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

print(int(float(55347740058143507128)))

哪个打印55347740058143506432。所以,因为 plain/会导致浮点数,这限制了它的准确性。

于 2018-09-08T03:49:10.317 回答