十进制整数除法的结果是什么?

问题描述 投票:1回答:1

我不确定整数除法实际上如何与十进制一起使用。考虑Python 3.x上的这两个例子:

4/0.4 = 10.0
4//0.4 = 9.0

常规除法给出10但整数除以4乘0.4得到9.0。

你知道带小数的整数除法的行为吗?为什么结果是这样的?

python integer-division
1个回答
1
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.