python - 整数除以小数的结果是什么?
问题描述
我不确定整数除法实际上如何与小数一起使用。考虑这两个例子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
您将看到二进制系统近似十进制数的方式所固有的经典浮动错误。结果 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
推荐阅读
- java - 在 Spring 中调用 REST 方法进行注释检测
- powershell - Powershell ScriptBlock 关闭:我错过了什么吗?
- php - 我无法从表单中删除 Woocommerce rest api 产品
- firebase - 无法无条件调用方法“[]”,因为接收者可以为“null”
- react-native - 如何将所选数据从 Flatlist 传递到另一个屏幕
- python - odoo 表中只有一次字段
- ruby-on-rails - Rails Devise 邀请链接无效
- python - 测试 FastAPI TestClient 对请求返回 422
- python - 如何在具有特定格式的文件中写入列表?
- python - 使用 plotly 实现带有飞行方向的地图