每个人都知道,或者至少每个程序员都应该知道,使用float
类型可能会导致精度错误。但是,在某些情况下,精确的解决方案将是很好的,并且有些情况下,使用epsilon值进行比较是不够的。无论如何,这并不是重点。
我知道Python中的Decimal
类型,但从未尝试使用过它。它指出"十进制数可以被准确表示", 我以为这意味着一种聪明的实现方式,可以表示任何实数。我的第一次尝试是:
>>> from decimal import Decimal
>>> d = Decimal(1) / Decimal(3)
>>> d3 = d * Decimal(3)
>>> d3 < Decimal(1)
True
很失望,我回到文档并继续阅读:
好的,所以实际上有一个精度。并且可以重现经典问题:算术运算的上下文是指指定精度的环境[...]
>>> dd = d * 10**20
>>> dd
Decimal('33333333333333333333.33333333')
>>> for i in range(10000):
... dd += 1 / Decimal(10**10)
>>> dd
Decimal('33333333333333333333.33333333')
所以,我的问题是:是否有一种具有无限精度的十进制类型?如果没有,比较两个十进制数的更优雅的方法是什么(例如,如果delta小于精度,则d3 < 1应返回False)。
目前,当我只进行除法和乘法时,我使用“分数”类型:
>>> from fractions import Fraction
>>> f = Fraction(1) / Fraction(3)
>>> f
Fraction(1, 3)
>>> f * 3 < 1
False
>>> f * 3 == 1
True
这是最好的方法吗?还有其他选择吗?
Pi
? - jfs