为什么这n选择r python代码不起作用?

时间:2019-09-02 17:24:56

标签: python-3.x

尽管遵循正确的定义,但n选择r代码的这2种变体得到了不同的答案

我看到此代码有效,

import math
def nCr(n,r):
    f = math.factorial
    return f(n) // f(r) // f(n-r)

但是我没有:

import math
def nCr(n,r):
    f = math.factorial
    return int(f(n) / (f(r) * f(n-r)))

使用测试用例nCr(80,20)将显示结果差异。请告知为什么它们在Python 3中与众不同,谢谢!

无错误信息。正确的答案应该是3535316142212174320,但是我的答案是3535316142212174336

1 个答案:

答案 0 :(得分:0)

这是因为int(a / b)a // b不同。

int(a / b)首先评估a / b,这是浮点除法。浮点数容易出现不准确,舍入错误等问题,例如.1 + .2 == 0.30000000000000004。因此,在某些时候,您的代码会尝试对非常大的数进行除法,这会导致舍入错误,因为浮点数具有固定大小,因此无法无限精确。

a // b整数除,这是另一回事。 Python的整数 可以任意大,并且它们的除法不会引起舍入错误,因此您可以获得正确的结果。

谈到浮点数是固定大小的 。看看这个:

>>> import math
>>> f = math.factorial
>>> f(20) * f(80-20)
20244146256600469630315959326642192021057078172611285900283370710785170642770591744000000000000000000
>>> f(80) / _
3.5353161422121743e+18

数字3.5353161422121743e+18的确切表示方式如下所示:3中最后一个53...43之后的数字没有信息,因为没有地方可以存储它。但是int(3.5353161422121743e+18)必须在其中放一些东西!但是它没有足够的信息。因此,它将所需的内容放在float(int(3.5353161422121743e+18)) == 3.5353161422121743e+18上。