首页 > 解决方案 > 整数除以小数的结果是什么?

问题描述

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

4/0.4 = 10.0
4//0.4 = 9.0

正则除法得到 10,但 4 除以 0.4 得到 9.0。

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

标签: pythoninteger-division

解决方案


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

您将看到二进制系统近似十进制数的方式所固有的经典浮动错误。结果 0.4 实际上存储为略大于 0.4 的值,您可以通过Decimal使用 0.4 实例化高精度对象来验证:

>>> 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

推荐阅读