python中整数除法的基本含义是什么?

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

我正在运行python 3.7.3

关于整数除法运算符:“ //”(双除法,双正斜杠,双除法运算符?我不确定确切的名称。)

它似乎并没有给出一致的结果,我发现的许多解释都没有完全解释其结果。

这里[What is the reason for having '//' in Python?(和其他位置),据说“ //”运算符给出了商,而没有余数。好像a // bfloor(a / b)相同(如果a / b为负,则四舍五入)。

但是,有时它无法给出答案。例如,1 // 0.2的结果为4。但是1 / 0.2返回5,math.floor(1 / 2)也返回5。它给出的数字比整数除法小。如果将10除以2,但//运算符将返回5,但1除以0.2将无法正常工作。

此问题有时在我使用//运算符对浮点数进行除法时出现。像5 // 0.2100 // 0.2。我不知道这是否是浮点运算的怪癖,但是如果您键入math.floor(5 / 0.2)(或任何其他出现问题的数字集),这些问题似乎就会消失。除除负数外,在这种情况下,必须使用math.ceil()而不是math.floor()

我当前的解决方案是:

import math
def integerDivision(a,b):
    tmp = a / b 
    if tmp > 1:
        return(math.floor(tmp))
    else:
        return(math.ceil(tmp))

//运算符的实现是什么,在某些浮点情况下,它不能给出正确的结果?除了上面的代码,还有没有更好的方法来解决此//运算符的问题?

python python-3.7 integer-division
1个回答
0
投票

这与实施无关。这与操作员的语义有关。无论实现如何,都需要//运算符才能为您提供在应用于浮点数时所看到的结果,并且这些结果确实是正确的(对于浮点数)。如果您不希望得到这些结果,则浮动可能是您所做工作的错误工具。

1 // 0.2给出浮点数,该浮点数表示其自变量的商的精确值的下限。但是,右边的参数并没有输入的值。右边的参数的值是在64位IEEE二进制浮点数中可表示的最接近0.2的值,该值略高于0.2:

>>> import decimal
>>> decimal.Decimal(0.2)
Decimal('0.200000000000000011102230246251565404236316680908203125')

商的精确值因此略小于5,因此1 // 0.2为您4.0

1 / 0.2为您提供5.0,因为商的确切值不能表示为浮点数。结果需要四舍五入,并且四舍五入为5.0//不执行此舍入;它会计算精确值的下限,而不是舍入后的浮点数。

尽管如此,实现需要比floor(x / y)更复杂,因为那样会导致错误的结果。 CPython的//实现基于fmod的浮点数。您可以在CPython源存储库的Objects/floatobject.c中查看实现。

Objects/floatobject.c
© www.soinside.com 2019 - 2024. All rights reserved.