Python:为什么0.01.as_integer_ratio()返回5764607523034235/576460752303423488

Python:为什么0.01.as_integer_ratio()返回5764607523034235/576460752303423488,python,integer,base,Python,Integer,Base,当我在用Python工作时,我注意到一些我不理解的东西 这个问题的答案需要以最低的通用术语给出分母。所以我想我应该使用float.as\u integer\u ratio()来检查分母是什么。结果是0.01.as_integer\u ratio()返回(5764607523034235,576460752303423488)和0.1.as_integer\u ratio()返回(360287970189639736028797018963968)而不是预期的1/100和1/10 为什么会这样?我

当我在用Python工作时,我注意到一些我不理解的东西

这个问题的答案需要以最低的通用术语给出分母。所以我想我应该使用
float.as\u integer\u ratio()
来检查分母是什么。结果是
0.01.as_integer\u ratio()
返回
(5764607523034235,576460752303423488)
0.1.as_integer\u ratio()
返回
(360287970189639736028797018963968)
而不是预期的
1/100
1/10


为什么会这样?我猜这与这些数字如何存储在计算机上有关。我还尝试了Python中的分数库,但结果相同。我希望有人能向我解释一下它为什么会这样。

计算机通常不能用十进制数字以10为基数进行计算。我不确定量子计算机是否不同,但通常情况下,数字是以2为基数进行内部计算的

如果没有这些知识,这可能是一个令人震惊的时刻:

>>> 0.1 + 0.1 + 0.1 == 0.3
False
这意味着通常使用近似值来获得该数字的良好表示。由于这些近似值,
0.1+0.1+0.1
不是
0.3

因此一个简单的
0.1
(基数10)变成
0.0001 1001 1001 1001…
(基数2,无止境)。但是分数是为了拯救和摆脱近似值<代码>浮点数。作为\u整数\u比率()想要精确:

返回一对整数,其比率正好等于原始浮点且分母为正

(见我的重点。)

因此,该方法使用一种算法来计算精确的比率,例如从
0.1
,该算法可以找到的最佳数字是
3602879701896397
36028797018963968
。看起来这些数字不错,因为分数库得到了相同的结果(如您所说)

顺便说一句:如果你用十进制数计算,那么以10为基数的一切都很好,你也可以用2为基数来处理,例如
0.5
(=
0.1
以2为基数):


如果你想阅读更多,还有一个很好的网站,里面有很多详细的信息和更多的链接。

正如colidyre提到的,问题在于浮点表示的不精确性。您可以使用分数库中的来获得正确的结果

>>> from fractions import Fraction
>>> Fraction(0.01).limit_denominator(100000)
1/100

“计算机不能以10为基数计算小数。”-当然可以,很容易。你只是没告诉我。
>>> from fractions import Fraction
>>> Fraction(0.01).limit_denominator(100000)
1/100