有人可以解释为什么以下三个例子全部相等?
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
对象是否有一般的“正确”方法? (即作为字符串或浮点数)
答案 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
。