整数除以小数的结果是啥?

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

【讨论】:

以上是关于整数除以小数的结果是啥?的主要内容,如果未能解决你的问题,请参考以下文章

java两个数相除后保留两位小数 (四舍五入),并且结果大于三位数要有千位分隔符,不是整数时,小数点前三

java一个整数除以一个小数为啥的到小数

小数的好处是啥

js 去除整数的小数点无用的零

整数除以整数后转成百分比并且保留一位小数

golang整数与小数间的加减乘除