为什么 Python 中 Decimal('0') > 9999.0 为 True? [重复]

问题描述 投票:0回答:2

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

在 Python 2.6.4 中:

>> Decimal('0') > 9999.0
True

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

>> type(Decimal('0')).__name__ > type(9999.0).__name__
False

那为什么是

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) [GCC 4.4.1] 在 linux2) 上。在 Windows 上(WinXP Professional SP3、Python 2.6.4(r264:75706,2009 年 11 月 3 日,13:23:17)[MSC v.1500 32 位(Intel)] on win32)我原来的声明工作方式有所不同:

>> Decimal('0') > 9999.0
False

我现在更疑惑了。 %-(

python comparison types operators logic
2个回答
12
投票

因为decimal模块不与除long、int和Decimal之外的任何类型进行比较。 在所有其他情况下,小数会默默地返回“它不知道对象的某些信息”作为更大的值。 您可以在decimal.py的_convert_other()函数中看到这种行为

愚蠢、愚蠢的十进制类。

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

所以,发生的事情是这样的:

  • 解释器调用
    Decimal.__gt__
    比较函数。
  • Decimal.__gt__
    调用
    Decimal._convert_other
    将传入的浮点数转换为十进制。
  • Decimal._convert_other
    不懂浮动。 实施在
    Decimal._convert_other
    显式检查操作数的
    long
    int
    Decimal
    类型。 是的,这是 一个错误,因为意外的库实现会导致进一步的错误。 它 做正确的事情或者甚至只是通过
    TypeException
    会更干净。 反而 它会经历与将 Decimal 与例如进行比较时相同的
    NotImplemented
    员工记录的哈希值。
  • 尝试了一些其他比较操作。 比较放弃。
  • 默认比较,在 CPython 的 Objects/object.c/default_3way_compare 中被调用。
  • 在 Python 3 中,这确实令人呕吐。 在 Python 2 中,它比较 id() 函数。
  • 在 Windows 上,使用(某种程度上)不区分大小写的比较。 在现代系统上, 使用区分大小写的比较。
  • 所以你会得到不同的结果。

我们到了吗?


1
投票
def __gt__(self, other, context=None):
    other = _convert_other(other)
    if other is NotImplemented:
        return other
    ans = self._compare_check_nans(other, context)
    if ans:
        return False
    return self._cmp(other) > 0


def _convert_other(other, raiseit=False):
    """Convert other to Decimal.

    Verifies that it's ok to use in an implicit construction.
    """
    if isinstance(other, Decimal):
        return other
    if isinstance(other, (int, long)):
        return Decimal(other)
    if raiseit:
        raise TypeError("Unable to convert %s to Decimal" % other)
    return NotImplemented
© www.soinside.com 2019 - 2024. All rights reserved.