在Python中,存在fractions.Fraction
和decimal.Decimal
标准库类,以帮助保持有理数精确的算术运算。对于不熟悉的例子,它有助于:
>>> 1 / 10 * 3
0.30000000000000004
>>> decimal.Decimal('1') / 10 * 3
Decimal('0.3')
>>> fractions.Fraction('1') / 10 * 3
Fraction(3, 10)
我的问题是,如果我有Fraction
,将其转换为Decimal
的最佳方式是什么?
不幸的是,显而易见的解决方案不起作用:
>>> decimal.Decimal(fractions.Fraction(3, 10))
Traceback (most recent call last):
...
TypeError: conversion from Fraction to Decimal is not supported
现在我正在使用此代码:
>>> decimal.Decimal(float(fractions.Fraction(3, 10)))
Decimal('0.299999999999999988897769753748434595763683319091796875')
现在,当我实际输出此值时,任何舍入量都会将其转换为0.3,并且我只在输出之前立即执行此转换(所有核心数学都使用Fraction
完成)。尽管如此,对我来说似乎有些愚蠢,我无法从Decimal('0.3')
获得Fraction(3, 10)
。任何帮助将不胜感激!
答案 0 :(得分:14)
如何将分数除以Decimal()
本身?
def decimal_from_fraction(frac):
return frac.numerator / decimal.Decimal(frac.denominator)
这是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')