我不确定整数除法实际上如何与十进制一起使用。考虑Python 3.x
上的这两个例子:
4/0.4 = 10.0
4//0.4 = 9.0
常规除法给出10但整数除以4乘0.4得到9.0。
你知道带小数的整数除法的行为吗?为什么结果是这样的?
CPython实现浮点数的底层除法,作为被除数或除数,位于float_floor_div
函数中,该函数调用float_divmod
函数(实现divmod
函数)进行实际计算,其中包含以下代码行:
mod = fmod(vx, wx);
div = (vx - mod) / wx;
...
floordiv = floor(div);
告诉你底层除法对浮点数的作用方式是首先调用fmod
函数来获得除法的余数,从被除数vx
中减去余数,然后除以除数wx
,然后再应用floor
函数由此产生的商div
。
如果你尝试执行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