【问题标题】:Fraction of a real number in python giving complicated answerpython中实数的分数给出复杂的答案
【发布时间】:2018-02-05 10:54:38
【问题描述】:

从分数中导入分数以给出实数的分数表示,但给出的响应相当复杂,用纸笔方法看起来很简单。
Fractions(.2) giving answer 3602879701896397/18014398509481984,
这是 0.20000000000000001110223024625157,几乎是 0.2,但我希望它只是 1/5。
我知道这个用途有limit(),但我只需要最小的分子和分母,它给出了确切的实数bcoz我正在处理很大范围内的很多数字,所以我不能对所有使用相同的limit()参数.

【问题讨论】:

  • 这不是您上面指定的问题的重复,我想知道不给 1/5 而是 3602879701896397/18014398509481984 的原因。完全不同。
  • 没有什么不同。那篇文章解释了为什么无法将0.2 存储在浮点数中。 就是原因。

标签: python fractions


【解决方案1】:

你的奇怪输出来自float point problems。在某些情况下,您可以通过使用Fraction.limit_denominator() 限制分母来克服这个问题。如果分母的实际值大于您使用的阈值,此过程当然也会导致舍入错误。此阈值的默认值为 1,000,000,但您也可以使用较小的值。

import fractions

print(fractions.Fraction(0.1))
>>>3602879701896397/36028797018963968

#lower the threshold to 1000
print(fractions.Fraction(0.1).limit_denominator(1000))
>>>1/10

#won't work for smaller fractions, use default of 1,000,000 instead
print(fractions.Fraction(0.00001).limit_denominator(1000))
>>>0
print(fractions.Fraction(0.00001).limit_denominator())
>>>1/100000

当然,如第一句所述,由于浮点数的存储方式存在精度限制。如果您有 10^9 大小的数字,您将无法准确表示小数部分中的 10 位数字为

a = 1234567890.0987654321
print(a)

证明。但是您可能会问自己,如果您真的需要 10^-15 的准确度,您的输入是否反映了这种准确度。如果您想获得更高的精度,您必须从一开始就使用decimal 模块,并在所有数学运算中提高精度水平。更好的是从一开始就将分子和分母作为整数值处理 - 在Python integer values are theoretically not restricted in size

【讨论】:

  • 这个答案很可能会满足 OP (+1)。尽管如此,“处理大范围内的大量数字,所以我不能对所有人使用相同的 limit() 参数。”,所以也许 limit_denominator 中的 1000. 不适用于所有值。
  • 是的,我处理过问题。与您展示的方式相同,但因为我的数字在 10^9 范围内。这可能表现得不够好。
  • @Florian 1000 是一个示例,如果您可以预期较小的值,您不必依赖默认值 1,000,000。我将更新答案并补充说这是一个例子。
【解决方案2】:

您可以使用Fraction类来表示0.2,并且可以通过如下方式访问分子和分母:

>>> from fractions import Fraction
>>> f = Fraction(1, 5)
>>> f.numerator
1
>>> f.denominator
5

希望对你有帮助。

【讨论】:

  • 这不是 OP 所要求的。他希望 0.2 表示为 1/5,而不是直接输入 1/5 作为分数
  • 我很抱歉。 :)
猜你喜欢
  • 2015-02-11
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2017-10-02
  • 2020-10-03
相关资源
最近更新 更多