我不确定整数除法实际上是如何与小数一起工作的。考虑到Python 3.x
上的这两个示例
4/0.4 = 10.0
4//0.4 = 9.0
正则除法得到10,但4除以0.4的整数除法得到9.0。
你知道整数除以小数的行为吗?为什么结果是这样的?
发布于 2019-02-18 14:55:23
CPython将浮点数的底除法实现为被除数或除数,位于float_floor_div
函数中,该函数调用float_divmod
函数(该函数实现divmod
函数)进行实际计算,其代码如下:
mod = fmod(vx, wx);
div = (vx - mod) / wx;
...
floordiv = floor(div);
告诉您地板除法对浮点数的作用方式是,首先调用fmod
函数以获得除法的余数,从被除数vx
中减去余数,然后将其除以除数wx
,然后对得到的商div
应用floor
函数。
如果你尝试执行4 % 0.4
的模运算,期望它是0
,因为4/ 0.4在数学上应该是10:
>>> 4 % 0.4
0.3999999999999998
您将看到从二进制近似十进制数的方式中固有的经典floating error。因此,0.4实际上被存储为略大于0.4的值,您可以通过使用0.4实例化一个高精度的Decimal
对象来验证这一点:
>>> from decimal import Decimal
>>> Decimal(0.4)
Decimal('0.40000000000000002220446049250313080847263336181640625')
这就是为什么4%0.4的余数是0.3999999999999998而不是0的原因,因此,使用float_divmod
计算商的方式,首先从被除数中减去余数,得到:
>>> 4 - 4 % 0.4
3.6
所以很自然的,
>>> (4 - 4 % 0.4) / 0.4
9.0
https://stackoverflow.com/questions/54741328
复制相似问题