比较从float和string创建的Python Decimal

时间:2015-08-17 14:58:32

标签: python decimal

有人可以解释为什么以下三个例子全部相等

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

在Python中创建Decimal对象是否有一般的“正确”方法? (即作为字符串或浮点数)

2 个答案:

答案 0 :(得分:5)

浮点数,默认使用的是基数2. 71.6不能在基数2中准确表示。(想想基数10中的1/3数字)。

因此,它们将被转换为浮点可以表示的小数位数。因为基数2中的数字71.6会永远持续下去并且你几乎肯定没有内存可以使用,所以计算机决定以较少的比特数代表它(好吧,被告知)。

如果您要使用字符串,程序可以使用算法来准确转换它,而不是从狡猾的圆形浮点数开始。

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

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

但是,如果您的数字可以完全表示为浮点数,那么它就像字符串

一样准确
>>> decimal.Decimal(71.5)
Decimal('71.5')

答案 1 :(得分:1)

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

因此,使用float初始化Decimal无法避免此问题。通常,您应该使用字符串初始化Decimal