在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
)。尽管如此,我认为无法从 Fraction(3, 10)
获得 Decimal('0.3')
有点傻。感谢任何帮助!
fractions.Fraction
和decimal.Decimal
标准库类存在的目的是帮助保持有理数算术的精确性。但是需要注意的是,Decimal.decimal
仍然是浮点数,只不过是基于10进制的浮点数。因此,Decimal(1) / Decimal(3)
无法给出精确的答案。 - Steven Rumbalski