整数除以小数的结果是啥?
Posted
技术标签:
【中文标题】整数除以小数的结果是啥?【英文标题】:What is a result of Integer division a decimal?整数除以小数的结果是什么? 【发布时间】:2019-02-18 06:08:53 【问题描述】:我不确定整数除法实际上如何与小数一起使用。考虑Python 3.x
上的这两个例子:
4/0.4 = 10.0
4//0.4 = 9.0
正则除法得到 10,但整数除以 4 除以 0.4 得到 9.0。
你知道整数与小数相除的行为以及为什么会这样吗?
【问题讨论】:
//
是地板除法,而不是“整数除法”。
根据the official Python 3 reference //
运算符是地板除法,而不是整数除法(使用非整数值的整数除法怎么会起作用?)。至于结果见Is floating point math broken?。
Is floating point math broken?的可能重复
与***.com/questions/183853/… 结合使用以获得完整效果。
What is the difference between '/' and '//' when used for division?的可能重复
【参考方案1】:
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
【讨论】:
以上是关于整数除以小数的结果是啥?的主要内容,如果未能解决你的问题,请参考以下文章