在Python 3.5中,当划分偶数时,为什么div和floor除以给出不同的答案

Mik*_*ika 4 python division

我试图划分一个非常大的偶数13144131834269512219260941993714669605006625743172006030529504645527800951523697620149903055663251854220067020503783524785523675819158836547734770656069476 我使用分区和分区,但它提供了两个不同的答案,我认为应该是相同的.所以我得到了

int(x/2) = 6572065917134756165333387211683112531415896759844144557192219233347999705289073358407747856661759761476763448808302430806962124152349175018830474952835072
int(x//2) = 6572065917134756109630470996857334802503312871586003015264752322763900475761848810074951527831625927110033510251891762392761837909579418273867385328034738
Run Code Online (Sandbox Code Playgroud)

有谁能告诉我结果的差异是什么?谢谢

Mar*_*ers 5

/ true division总是产生浮点结果,并且您无法使用浮点数精确地建模您的数字:

>>> huge = 13144131834269512219260941993714669605006625743172006030529504645527800951523697620149903055663251854220067020503783524785523675819158836547734770656069476
>>> huge / 2
6.572065917134756e+153
>>> type(huge / 2)
<class 'float'>
Run Code Online (Sandbox Code Playgroud)

这是10 ^ 153的6倍,但float在尾数中只能携带53个二进制数字的精度:

>>> import sys
>>> sys.float_info.mant_dig
53
Run Code Online (Sandbox Code Playgroud)

浮点使用二进制分数来对小数部分进行建模,这意味着对于大多数可能的十进制值,这只是一个近似值.

将该值转换int()为不会带来丢失的精度.

// 另一方面,floor division为整数输入生成一个整数,整数具有任意精度,因此不会丢失任何内容:

>>> type(huge // 2)
<class 'int'>
Run Code Online (Sandbox Code Playgroud)