比较从float和string创建的Python Decimal

maf*_*sis 5 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
Run Code Online (Sandbox Code Playgroud)

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

mud*_*ish 6

浮点数,默认情况下使用的是基数2. 71.6无法在基数2中准确表示.(可以考虑数字,如基数10中的1/3).

因此,它们将被转换为浮点可以表示的小数位数.因为基数2中的数字71.6将永远存在并且你几乎肯定没有无限的内存可供使用,所以计算机决定用较少的位来表示它(好吧,被告知).

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

>>> decimal.Decimal(71.6)
Decimal('71.599999999999994315658113919198513031005859375')
Run Code Online (Sandbox Code Playgroud)

相比

>>> decimal.Decimal("71.6")
Decimal('71.6')
Run Code Online (Sandbox Code Playgroud)

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

>>> decimal.Decimal(71.5)
Decimal('71.5')
Run Code Online (Sandbox Code Playgroud)

  • 你能用一些例子来说明吗?*"它们将被转换为更多小数位"*最多只是羊毛. (2认同)