【问题标题】:Python float to ratioPython浮点比率
【发布时间】:2013-11-21 15:04:59
【问题描述】:

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

>>> value = 3.2
>>> ratios = value.as_integer_ratio()
>>> ratios
(3602879701896397, 1125899906842624)
>>> ratios[0] / ratios[1]
3.2

我使用 python 3.3

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

以及为什么它对2.5 正确

>>> value = 2.5
>>> value.as_integer_ratio()
(5, 2)

【问题讨论】:

  • 你期待什么?
  • 16 / 5?为什么不32 / 10
  • (16, 5) 例如。但我明白为什么我会得到这么大的数字
  • 16 / 5 是最简化的形式
  • 可能重复:关于浮点数学的每一个问题。

标签: python floating-point python-3.3 fractions


【解决方案1】:

使用fractions module 化简分数:

>>> from fractions import Fraction
>>> Fraction(3.2)
Fraction(3602879701896397, 1125899906842624)
>>> Fraction(3.2).limit_denominator()
Fraction(16, 5)

来自Fraction.limit_denominator() function

查找并返回最接近的Fractionself,其分母最多为max_denominator。此方法对于找到给定浮点数的有理逼近很有用

浮点数精度有限,不能精确表示;你看到的是一个四舍五入的表示,但实数是:

>>> format(3.2, '.50f')
'3.20000000000000017763568394002504646778106689453125'

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

【讨论】:

  • 谢谢,我知道怎么用fractions我不明白为什么
  • 没有必要进一步扩展我的答案 - 获得“理智”代表的好解决方案:)
【解决方案2】:

它不是 16/5,因为 3.2 不是 3.2 完全是...它是它的浮点粗略近似...例如:3.20000000000000017764

【讨论】:

  • 但是为什么2.52.5一样和3.2不一样呢?
  • @itdxer 我认为它的值对于以.5 作为除数的数字来说非常稳定。它们可以完全按照您的定义来表示。
  • @itdxer 因为有些数字可以精确表示,有些则不能...查看FallenAngel provided的链接
  • 因为您可以使用二进制(以 2 为基数)显示整数,但显示小数部分很困难,因为您可能无法准确地以二进制(以 2 为基数)写入十进制数。因此,编程语言会尝试评估最接近您预期结果的值。
猜你喜欢
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
相关资源
最近更新 更多