Python:为什么0.01.as_integer_ratio()返回5764607523034235/576460752303423488
当我在用Python工作时,我注意到一些我不理解的东西 这个问题的答案需要以最低的通用术语给出分母。所以我想我应该使用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 为什么会这样?我
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