地板除法 // 和 int() 四舍五入

3

我是Python 3.6.0的新用户。我试图除以两个数,但结果很大。然而,使用

return ans1 // ans2

使用时会产生55347740058143507128

return int(ans1 / ans2)

生成了55347740058143506432。

哪个更准确,为什么呢?


你需要指定你正在使用的编程语言。 - zneak
@zneak 谢谢。我是个新手。 - GordonJun
没问题。你能澄清一下你使用的 Python 版本吗?最后,你可以运行 repr(ans1)repr(ans2) 并发布结果吗? - zneak
@zneak 好的。我正在使用3.6.0版本。我已经打印了repr(ans1),结果为45159067006671175434518243598614826795313039459718126370816000000000,以及repr(ans2),结果为815915283247897734345611269596115894272000000000。 - GordonJun
欢迎来到stackoverflow。请查看如何提出好问题的指南。下次提问时,请确保使用相应的语言标签 - 大多数人都会浏览标记的问题,因此你的受众大部分不会看到这个问题。 - wordragon
2个回答

7

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

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

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

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

我们可以看到,在53位尾数无法容纳的结果中,最不显著的几位都被设置为零。
一种直接观察舍入的方法,而不受除法带来的任何复杂性影响是:
>>> int(float(55347740058143507128))
55347740058143506432L

3

在这方面,使用向下取整的整数除法更加准确。

使用 int(ans1 / ans2) 这种写法会导致结果暂时变成一个浮点数(在转换为整数之前),引入了接近浮点数的舍入误差(舍入误差大小取决于数字的数量级)。这甚至可以通过尝试将该值通过浮点数来round-trip进行验证:

print(int(float(55347740058143507128)))

这段代码打印出 55347740058143506432。因为普通的/会返回浮点数,这会限制精确度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接