Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 整数除法与下限商的比较:为什么会有这样令人惊讶的结果?_Python_Python 3.x_Python 2.x_Integer Division_Floor - Fatal编程技术网

Python 整数除法与下限商的比较:为什么会有这样令人惊讶的结果?

Python 整数除法与下限商的比较:为什么会有这样令人惊讶的结果?,python,python-3.x,python-2.x,integer-division,floor,Python,Python 3.x,Python 2.x,Integer Division,Floor,Python的/“整数除法”运算符今天让我很惊讶: >>> math.floor(11/1.1) 10.0 >>> 11//1.1 9.0 读数为x和y的“(地板)商”。那么,为什么math.floor(11/1.1)等于10,但11//1.1等于9?因为1.1不能以二进制形式精确表示;近似值略高于1.1-因此除法结果有点太小 请尝试以下操作: 在Python 2下,在控制台键入: >>> 1.1 1.1000000000000001 在

Python的
/
“整数除法”运算符今天让我很惊讶:

>>> math.floor(11/1.1)
10.0
>>> 11//1.1
9.0

读数为x和y的“(地板)商”。那么,为什么math.floor(11/1.1)等于10,但11//1.1等于9?

因为1.1不能以二进制形式精确表示;近似值略高于1.1-因此除法结果有点太小

请尝试以下操作:

在Python 2下,在控制台键入:

>>> 1.1
1.1000000000000001
在Python3.1中,控制台将显示
1.1
,但在内部,它仍然是相同的数字

但是:

正如gnibbler指出的,这是浮动可用精度限制内“内部舍入”的结果。正如MYYN在他的评论中指出的那样,
/
使用与
math.floor()不同的算法来计算地板分割结果,以便尽可能地保留
a==(a//b)*b+a%b


如果需要此精度,请使用
Decimal
类型。

但根据Python,
11.0/1.1==10.0
是真实的,因为我们知道1.1存储为1.10000000000001,因此Python中的结果11.0/1.1是9.99999999999909090909090909,但最接近此数字的浮点值实际上是10.0,结果正好是10。0@Tim我想到了这一点,我相信这是math.floor(11/1.1)和11//1.1之间区别的关键。然而,正如gnibbler所指出的,1.1由一个稍大的数字表示的事实只表明math.floor(11/1.1)实际上应该是9.0,这使得原来的问题仍然悬而未决。@EOL,因为11/1.1的计算结果正好是10.0,math.floor(11/1.1)=math.floor(10.0),然而,这只是由于一些幸运的rounding@gnibbler:是的,让我吃惊的是“运气”方面:两个“相同”的操作以不同的方式运行。:)正如MYYN所指出的,在实现中有解释
>>> 11/1.1
10.0