在对 Python 3.52 中的 float 类型到 Fraction 类型转换主题进行练习时,我发现了两种不同转换方式之间的差异。
第一种方法是:
>>> from fractions import Fraction
>>> x = 1232.23
>>> f = Fraction(*x.as_integer_ratio())
>>> print(f)
2709702426188841/2199023255552 #Answer
第二种方法是:
>>> from fractions import Fraction
>>> x = 1232.23
>>> f = Fraction(str(x))
>>> print(f)
123223/100 #Answer
我想知道这两个不同答案背后的原因是什么?抱歉,如果这是一个愚蠢的问题,我是编程和 Python 的新手。
编辑:我找到了一种方法,可以将第一种方法获得的不准确分数转换为准确分数limit_denominator
method:
>>> from fractions import Fraction
>>> x = 1232.23
>>> f = Fraction(*x.as_integer_ratio())
>>> f = f.limit_denominator(100)
>>> print(f)
123223/100
这又是因为浮点数不是以 10 为基数(十进制)存储的,而是以 2 为基数(二进制)存储的。
以 10 为基数的有限长度数字可能是以 2 为基数的重复小数。由于浮点数的大小是固定的,重复的小数会被截断,从而导致不准确。
当你使用as_integer_ratio
对于以 2 为基数的重复小数的数字,由于 10 基数到 2 基数转换中的轻微不准确,您将得到一个有点愚蠢的分数。如果您将这两个数字相除,则该值将非常接近您的原始数字。
例如,虽然 1/10 = 0.1(以 10 为基数)并且不是循环小数,但它实际上是以 2 为基数的循环小数。就像以 10 为底的 1/3 = 0.333 一样。
>>> (0.1).as_integer_ratio()
(3602879701896397, 36028797018963968)
如果 Python 的输出是准确的,即使您只输入0.1
在提示符中,得到类似 1.00000...01 的输出。但是Pythonhides在一般情况下,您的这种不准确会导致混乱。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)