在Python 3.5中,当对一个偶数进行除法运算时,为什么使用除法运算符和地板除运算符会得到不同的答案?

4

我试图将一个非常大的偶数 13144131834269512219260941993714669605006625743172006030529504645527800951523697620149903055663251854220067020503783524785523675819158836547734770656069476 进行除法和地板除法运算,但是它们提供了两个不同的答案,我认为这两个答案应该是相同的。

int(x/2) = 6572065917134756165333387211683112531415896759844144557192219233347999705289073358407747856661759761476763448808302430806962124152349175018830474952835072
int(x//2) = 6572065917134756109630470996857334802503312871586003015264752322763900475761848810074951527831625927110033510251891762392761837909579418273867385328034738

有人能告诉我差异的原因吗?谢谢。

7
int()// 中是多余的。/ 会产生 浮点数,而浮点数有其极限。您已超出了这些极限。 - Martijn Pieters
1个回答

5

/ 真除法始终产生一个浮点数结果,你不能用浮点数精确地模拟你的数字:

>>> huge = 13144131834269512219260941993714669605006625743172006030529504645527800951523697620149903055663251854220067020503783524785523675819158836547734770656069476
>>> huge / 2
6.572065917134756e+153
>>> type(huge / 2)
<class 'float'>

那是6乘以10的153次方,但是float只能在尾数中承载53个二进制数字的精度:

>>> import sys
>>> sys.float_info.mant_dig
53

浮点数使用二进制小数来模拟十进制部分,这意味着对于可能的大多数十进制值而言,它仅仅是一个近似值。

将该值转换为 int()不会恢复失去的精度。

//另一方面,底除法产生整数输入的整数,并且整数具有任意精度,因此没有损失:

>>> type(huge // 2)
<class 'int'>

虽然您肯定可以从sys.float_info.mant_dig中获取尾数,但是否正确说它在所有平台上都是53呢? - Labrys Knossos
@LabrysKnossos:我相信在所有现代平台上运行Python的版本都将是53。 - Martijn Pieters

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