Skip to main content
 首页 » 编程设计

python之浮点除法与整数除法给出不同的答案

2025年05月04日21kerrycode

我在一段代码中遇到了一些问题,最终执行了以下命令行片段。这只是一个实验,我没有在实际代码中的任何变量中存储如此大的值(模 10**9 + 7).

>>> a=1 
>>> for i in range(1,101): 
...     a=a*i 
... 
>>> b=1 
>>> for i in range(1,51): 
...     b=b*i 
... 
>>> c=pow(2,50) 
>>> a//(b*c) 
2725392139750729502980713245400918633290796330545803413734328823443106201171875 
>>> a/(b*c) 
2.7253921397507295e+78 
>>> (a//(b*c))%(10**9 +7) 
196932377 
>>> (a/(b*c))%(10**9 +7) 
45708938.0 
>>> 

我不明白为什么整数除法给出正确的输出而浮点除法失败。

基本上我计算了:( (100!)/((50!)*(2^50)) ) % (10**9 +7)

请您参考如下方法:

因为精度。

整数和 float 的编码不同。特别是,在 python 3 中,整数可以是任意大的——例如,当您将其转换为二进制时,您给出的整数超过 250 位。无论它们有多大,它们的存储方式都可以容纳。

但是, float 有一定的大小限制——通常是 64 位。这 64 位分为符号(1 位)、尾数和指数 - 尾数中的位数限制了数字的精确度。 Python's documentation contains a section on this limitation .

所以,当你这样做的时候

(a//(b*c))%(10**9 +7) 

您正在使用整数执行该计算,而整数又是任意大的。但是,当您这样做时:

(a/(b*c))%(10**9 +7) 

您正在使用只有 18 位有效数字的数字执行该计算 - 它已经不精确,并且用它进行更多计算只会进一步破坏答案。

如果您需要使用非常大的 float ,可以使用 python 的 decimal module 来避免这种情况。 (它是标准库的一部分),不会有这些问题。