为什么N // x和math.floor提供不同的输出来计算事实的和(100)

时间:2019-04-21 09:20:01

标签: python python-3.x

我用它来查找事实(100)的所有数字的总和,它给了我正确的输出648。

while(fact>0):
    r=fact%10
    sum=sum+r
    fact=fact//10

print(sum)

但是,在使用相同的脚本(用//替换为math.floor()函数)时,我获得了675作为输出。

while(fact>0):
    r=fact%10
    sum=sum+r
    fact=floor(fact/10)

print(sum)

请帮助我解决这个异常问题。据我了解,N // x和math.floor()是可互换的。

1 个答案:

答案 0 :(得分:0)

使用/将输出一个浮点数,该浮点将打开float arithmetic error的门。简而言之,这意味着由于计算机如何存储实数,您的除法单位数字是错误的,因此您不应该依赖浮点除法。

详细信息

在有限数量的二进制表示形式中压缩无限多个实数是不可能的。因此,每个实数只能由带有一定误差的浮点数来近似。这是众所周知的,即使它不是特定于Python的,它也是文档mentions it

可以计算出一个近似值的最大浮点误差,尽管仅知道对于诸如fact(100) / 10这样的非常大的浮点数,该误差大于1。这意味着四舍五入为整数会给出错误的结果。

因此,每当您可以使用整数算术而不是浮点算术时,都应该这样做,因为整数算术总是精确的。