EB.*_*EB. 5 python floating-point compare decimal
所以我有一个班轮:
import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01))
Run Code Online (Sandbox Code Playgroud)
它所做的就是使一个Decimal对象保持100.0,并以各种方式将它与.01(浮点数)进行比较.
我的结果是:
>>> import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01))
(False, True, NotImplemented, NotImplemented)
Run Code Online (Sandbox Code Playgroud)
从文档:"丰富的比较方法可能会返回单例NotImplemented,如果它没有实现给定的参数对的操作."
所以这里真的有三个问题.
当富比较方法返回NotImplemented时会发生什么?为什么不引发异常?
当它得到NotImplemented时,为什么它在第一种情况下返回False,在第二种情况下返回True?bool(NotImplemented)应该是一个常量.
它是否简单地回到id()检查?似乎没有(或是,但是倒退):
(忽略这一行,格式化搞砸了,这就搞定了)
from decimal import Decimal
h = Decimal('100.0')
f = .01
print h < f, id(h) < id(f)
print h > f, id(h) > id(f)
Run Code Online (Sandbox Code Playgroud)
我的结果测试了:
Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on win32
Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
Run Code Online (Sandbox Code Playgroud)
编辑:有关订购的文档:http://docs.python.org/library/stdtypes.html#comparisons
当富比较方法返回NotImplemented时会发生什么?为什么不引发异常?
它委托反向方法(例如,__lt__当运算符是>)RHS中的比较(the float) - 在这种情况下也返回NotImplemented - 并最终回到Python 2愚蠢的旧规则进行异构比较.
当它得到NotImplemented时,为什么它在第一种情况下返回False,在第二种情况下返回True?bool(NotImplemented)应该是一个常量.
没有bool涉及 - 因为比较的两边都返回NotImplemented(由于故意的设计决定不支持小数和浮点数之间的任何操作),愚蠢的旧规则被用作后备(并且在最近足够的版本将进行比较因此,类型而不是实例id与它无关.在Python 3中,这种不受支持的异构比较会失败,并引发一个明显的异常,但在Python 2中,为了向后兼容,这是不可能的 - 它必须保持在Python 2的生命周期中表现得愚蠢的行为.
引入向后不兼容性来修复现在被认为是设计错误的东西,比如这个关于het比较的部分,是引入Python 3 的核心原因.只要你坚持使用Python 2(例如因为它有更多的第三方扩展等) ,你需要咧嘴笑,忍受只在Python 3中修复的这些缺陷.
| 归档时间: |
|
| 查看次数: |
419 次 |
| 最近记录: |