为什么Python中的Decimal('0')> 9999.0为True?

par*_*ier 5 python comparison logic types operators

这在某种程度上与我的问题有关为什么在Python中''> 0 True?

在Python 2.6.4中:

>> Decimal('0') > 9999.0
True
Run Code Online (Sandbox Code Playgroud)

从我对原始问题的回答中我了解到,在Python 2.x中比较不同类型的对象时,类型按其名称排序.但在这种情况下:

>> type(Decimal('0')).__name__ > type(9999.0).__name__
False
Run Code Online (Sandbox Code Playgroud)

那为什么Decimal('0') > 9999.0 == True呢?

更新:我通常在Ubuntu上工作(Linux 2.6.31-20-generic#57-Ubuntu SMP Mon Feb 8 09:05:19 UTC 2010 i686 GNU/Linux,Python 2.6.4(r264:75706,2009年12月7日,18 :45:15)[关于linux2的[GCC 4.4.1]).在Windows上(winX上的WinXP Professional SP3,Python 2.6.4(r264:75706,2009年11月3日,13:23:17)[MSC v.1500 32位(英特尔)]我的原始语句的工作方式不同:

>> Decimal('0') > 9999.0
False
Run Code Online (Sandbox Code Playgroud)

我现在更加困惑.% - (

Cha*_*iam 12

因为十进制模块不会与除long,int和Decimal之外的任何类型进行比较.在所有其他情况下,十进制静默地返回"不是它知道对象的东西"更大.您可以在decimal.py的_convert_other()函数中看到此行为

愚蠢,愚蠢的十进制课.

哦,请参阅http://bugs.python.org/issue2531.

那么,这是发生了什么:

  • 解释器调用Decimal.__gt__比较函数.
  • Decimal.__gt__调用Decimal._convert_other将传入的float转换为Decimal.
  • Decimal._convert_other不了解花车.倒在实施Decimal._convert_other 明确的检查long,intDecimal类型的操作数.是的,这是一个错误,因为意外的库实现会导致进一步的错误.做正确的事情甚至只是做一件事情会更干净TypeException.相反,它NotImplemented通过将Decimal与例如Employee记录的哈希进行比较而发生的情况相同.
  • 尝试了一些其他比较操作.比较放弃了.
  • 调用CPython的Objects/object.c/default_3way_compare中的默认比较.
  • 在Python 3中,这是正确的barfs.在Python 2中,它比较了id()函数.
  • 在Windows上,使用不区分大小写的比较(排序).在现代系统中,使用区分大小写的比较.
  • 所以你会得到不同的结果.

我们到了吗?

  • @Charles Merram:这不太对劲.Decimal不会将"它不知道对象的东西"返回为更大:它返回`NotImplemented`.由于比较的浮点数也返回`NotImplemented`,因此当任何操作数都不知道如何与另一个进行比较时,Python会回退到它应用的默认规则.这最终有效地比较了`id(float)`和`id(Decimal)`,所以结果只取决于`float`和`Decimal`类型的内存中的地址(这解释了平台差异).血淋淋的细节在Objects/object.c中的`default_3way_compare`中. (3认同)