比较 Python 从浮点数和字符串创建的小数

Comparing Python Decimals created from float and string

谁能解释一下为什么下面三个例子不都一样

ipdb> Decimal(71.60) == Decimal(71.60)
True
ipdb> Decimal('71.60') == Decimal('71.60')
True
ipdb> Decimal(71.60) == Decimal('71.60')
False

是否有一种通用的 'correct' 方法可以在 Python 中创建 Decimal 对象? (即,作为字符串或浮点数)

默认使用的浮点数以 2 为基数。71.6 不能以 2 为基数准确表示。(想想像 1/3 这样的数字以 10 为基数)。

因此,它们将被转换为浮点数可以表示的小数位数。因为基数 2 中的数字 71.6 会永远持续下去,而且您几乎可以肯定没有无穷无尽的内存可以玩,所以计算机决定用更少的位数来表示它(嗯,被告知)。

如果您改用字符串,程序可以使用算法对其进行精确转换,而不是从不可靠的四舍五入浮点数开始。

>>> decimal.Decimal(71.6)
Decimal('71.599999999999994315658113919198513031005859375')

相比
>>> decimal.Decimal("71.6")
Decimal('71.6')

但是,如果您的数字可以精确表示为浮点数,则它与字符串一样准确

>>> decimal.Decimal(71.5)
Decimal('71.5')

通常使用Decimal来避免浮点精度问题。例如,float 文字 71.60 在数学上不是 71.60,而是一个非常接近它的数字。

因此,使用float 来初始化Decimal 并不能避免这个问题。一般来说,应该使用字符串来初始化Decimal.