Python浮动到比率

itd*_*xer 7 python floating-point fractions python-3.3

我尝试获得变量的比例并得到意想不到的结果.有人可以解释一下吗?

>>> value = 3.2
>>> ratios = value.as_integer_ratio()
>>> ratios
(3602879701896397, 1125899906842624)
>>> ratios[0] / ratios[1]
3.2
Run Code Online (Sandbox Code Playgroud)

我使用python 3.3

但我认为这(16, 5)是更好的解决方案

为什么它是正确的 2.5

>>> value = 2.5
>>> value.as_integer_ratio()
(5, 2)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 15

使用该fractions模块简化分数:

>>> from fractions import Fraction
>>> Fraction(3.2)
Fraction(3602879701896397, 1125899906842624)
>>> Fraction(3.2).limit_denominator()
Fraction(16, 5)
Run Code Online (Sandbox Code Playgroud)

Fraction.limit_denominator()功能:

查找并返回最接近Fractionself具有最多max_denominator分母.此方法可用于查找给定浮点数的有理逼近

浮点数的精度有限,并不能准确表示多个数字; 你看到的是圆形表示,但实数是:

>>> format(3.2, '.50f')
'3.20000000000000017763568394002504646778106689453125'
Run Code Online (Sandbox Code Playgroud)

因为浮点数表示为二进制分数的总和; 1/5只能通过将1/8 + 1/16 + 1/128 +以上的二进制分数相加来表示,以增加2的指数.


Jon*_*nts 5

这不是因为16/5 3.2不是3.2 正好 ......这是它的一个浮点粗略近似...例如:3.20000000000000017764