这个问题已经在这里有一个答案:
我正在写一个使用Fractions
模块的程序。我希望得到一个浮动的最简单的部分。当我像0.5
数字尝试它,它正常工作:
>>> import fractions
>>> str(fractions.Fraction(0.5))
'1/2'
但是,当我尝试用0.55
或0.1
代替11/20
和1/10
它显示具有非常高的分子和分母的分数。
>>> str(fractions.Fraction(0.1))
'3602879701896397/36028797018963968'
>>> str(fractions.Fraction(0.55))
'2476979795053773/4503599627370496'
我能做些什么,以确保该脚本将始终显示最简化的分数?有没有办法用Fractions
模块或其他模块做,或者我写的函数自己?
当你经过0.55
要传递在浮子,所以它的Fraction
接收值之前已经是一种不精确的表示。
另外,如果你传递一个字符串,而不是,你可以得到你想要的确切值:
>>> fractions.Fraction('0.55')
Fraction(11, 20)
尝试这个:
fractions.Fraction(0.1).limit_denominator()
查看结果:
In [77]: str(fractions.Fraction(0.55).limit_denominator())
Out[77]: '11/20'
In [78]: str(fractions.Fraction(0.1).limit_denominator())
Out[78]: '1/10'
尝试从decimal
docs模块例如:
>>> from fractions import Fraction
>>> from decimal import Decimal
>>> Fraction(Decimal('0.55'))
>>> Fraction(11, 20)
>>> str(Fraction(11, 20))
>>> '11/20'
把它作为字符串得到简化部分:
>>> fractions.Fraction('0.1')
Fraction(1, 10)
>>> str(fractions.Fraction('0.1'))
'1/10'