将fractions.Fraction转换为decimal.Decimal的最佳方法?

Dan*_*aro 10 python decimal standard-library fractions

在Python中,fractions.Fractiondecimal.Decimal标准库类存在,以帮助保持精确有理数运算.对于不熟悉的例子,它有助于:

>>> 1 / 10 * 3
0.30000000000000004
>>> decimal.Decimal('1') / 10 * 3
Decimal('0.3')
>>> fractions.Fraction('1') / 10 * 3
Fraction(3, 10)
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我有一个Fraction,将它转换成一个最好的方法是Decimal什么?

不幸的是,明显的解决方案不起作用

>>> decimal.Decimal(fractions.Fraction(3, 10))
Traceback (most recent call last):
  ...
TypeError: conversion from Fraction to Decimal is not supported
Run Code Online (Sandbox Code Playgroud)

现在我正在使用这段代码:

>>> decimal.Decimal(float(fractions.Fraction(3, 10)))
Decimal('0.299999999999999988897769753748434595763683319091796875')
Run Code Online (Sandbox Code Playgroud)

现在,当我实际输出此值时,任何舍入量都会将其转换为0.3,并且我只在输出之前立即执行此转换(所有核心数学都已完成Fraction).尽管如此,对我来说似乎有些愚蠢,我无法从中得到Decimal('0.3')一个Fraction(3, 10).任何帮助,将不胜感激!

Mar*_*ers 16

离开分数的分裂怎么样Decimal()

def decimal_from_fraction(frac):
    return frac.numerator / decimal.Decimal(frac.denominator)
Run Code Online (Sandbox Code Playgroud)

这就是Fraction.__float__()(简单地将分子除以分母),但是通过将两个值中的至少一个转换为Decimal对象,您可以控制输出.

这允许您使用decimal上下文:

>>> decimal_from_fraction(fractions.Fraction(3, 10))
Decimal('0.3')
>>> decimal_from_fraction(fractions.Fraction(1, 55))
Decimal('0.01818181818181818181818181818')
>>> with decimal.localcontext() as ctx:
...    ctx.prec = 4
...    decimal_from_fraction(fractions.Fraction(1, 55))
...
Decimal('0.01818')
Run Code Online (Sandbox Code Playgroud)

  • 是否有理由以类方法`from_decimal`支持转换另一种方式?`frac = fractions.Fraction.from_decimal(decimal.Decimal('0.3'))`是有效的,但是`Decimal`没有`from_fraction`方法. (3认同)
  • @roganjosh:啊,[有一个功能请求](http://bugs.python.org/issue15136) 但该请求从未就如何最好地实现这一点达成共识。 (3认同)