蟒蛇小数比较(python decimal comparison)

2019-07-29 10:20发布

蟒蛇小数比较

>>> from decimal import Decimal
>>> Decimal('1.0') > 2.0
True

我期待它正确地转换2.0,但看完后直通PEP 327我知道有一些理由不implictly转换浮到小数,但不应该在这种情况下,应该提高类型错误,因为在这种情况下做

>>> Decimal('1.0') + 2.0
Traceback (most recent call last):
  File "<string>", line 1, in <string>
TypeError: unsupported operand type(s) for +: 'Decimal' and 'float'

所以做了所有其他运营商/ - %//等

所以我的问题是

  1. 这是正确的行为? (不提高在CMP除外)
  2. 如果我得到我自己的类和右边的浮动转换器基本上十进制(再版(float_value)),是否有什么注意事项? 我的使用案例涉及价格只比

系统的详细资料的Python 2.5.2在Ubuntu 8.04.1

Answer 1:

回复1,这是我们确实设计的行为 - 对或错,因为它可能是(抱歉,如果是绊倒你的使用情况,但我们试图成为一般!)。

具体来说,它早就被每一个Python对象可能会受到与其他所有不平等比较的情况下 - 的类型的对象没有被真正可比性得到任意相比(始终在给定的运行,不一定是整个运行); 主要用例被排序的异构列表以在它族元素由类型。

一个例外是推出了只有复数,使他们不媲美任何东西 - 但是这仍然是很多年前,当我们偶尔漫不经心约打破完美的用户代码。 如今,我们即将向后兼容性更为严格的一个主要版本内(如沿2.*线,并分别沿3.*之一,但不兼容允许2和3之间-事实上这是具有整点3.*系列,让我们解决,即使在不兼容的方式过去的设计决策)。

在任意的比较结果是更多的麻烦比他们的价值,造成用户混淆; 并且现在可以用容易获得例如通过类型分组key=lambda x: str(type(x))参数sort ; 所以在Python不同类型的对象,除非对象本身的特别允许在比较方法之间的比较3,确实引起异常:

>>> decimal.Decimal('2.0') > 1.2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: Decimal() > float()

换句话说,在Python 3这一行为完全因为你认为它应该; 但在Python 2它没有(也绝不会在任何的Python 2.* )。

回复2,你会没事的-虽然,放眼gmpy什么我希望是通过法里树木双打无限精度分数转换成一种有趣的方式。 如果你正在处理的价格都精确到不超过美分,使用'%.2f' % x ,而不是repr(x) !)

而不是十进制的一个子类,我会使用一个工厂函数,如

def to_decimal(float_price):
    return decimal.Decimal('%.2f' % float_price)

由于一旦产生,所得到的十进制是非常普通的。



Answer 2:

将大于比较可行的,因为,在默认情况下,它适用于所有对象。

>>> 'abc' > 123
True

Decimal是正确的,只是因为它正确地遵循规范。 无论是规范是正确的做法是一个单独的问题。 :)

只有花车打交道时,其简要概括的正常限制条件是:提防边缘的情况下,如负零,+/-无穷大和NaN,不测试相等(与下一个点),并在数学计算之中稍不准确的。

>>> print (1.1 + 2.2 == 3.3)
False


Answer 3:

如果它是“正确的”,是见仁见智,但为什么没有自动转换的理由在PEP存在,那就是作出的决定。 需要说明的基本上是,你不能总是精确地漂浮和十进制之间的转换。 因此,转换不应该是隐含的。 如果您在应用程序知道你永远不会有足够的显著号码,这会影响你,使类,允许这种隐含的行为不应该是一个问题。

此外,一个主要论点是,现实世界中的用例不存在。 这很可能是简单的,如果你只使用十进制无处不在。



文章来源: python decimal comparison