2012-02-22 69 views
5

当我与Python瞎搞,为什么float中的对象没有分母属性,而int呢?

>>> [attr for attr in dir(1) if not attr.startswith('_')] 
['bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real'] 
>>> [attr for attr in dir(1.1) if not attr.startswith('_')] 
['as_integer_ratio', 'conjugate', 'fromhex', 'hex', 'imag', 'is_integer', 'real'] 

虽然我明白,“结合”,“IMAG”和“真实”是为了与复杂类型兼容性的缘故,我不明白为什么“分子”和“分母”仅存在于int中,并不适用于float。

对此有何解释?

+3

,你会想到什么'math.pi.denominator'返回? – dan04 2012-02-22 20:55:50

+0

我会说7,但在维基百科之后,我明白pi是非理性的数字,并不完全等于22/7的理性版本。 – Radian 2012-02-22 21:29:43

回答

5

这很可能是因为漂浮物有点有损 - 它们不能完美地代表每个值。考虑下面这个例子:

>>> 1.0/5.0 
0.20000000000000001 

如果你想访问1.0/5.0蟒蛇的分母就必须返回1801439850948198420000000000000001/100000000000000000 == 3602879701896397/18014398509481984)。精度的降低将导致python别无选择,只能返回疯狂的值,所以设计人员选择不实现该功能。

+0

你的意思是'3602879701896397/18014398509481984'。 – dan04 2012-02-22 21:05:31

+0

为什么我愿意,谢谢。 – 2012-02-22 21:09:17

5

看看数类层次结构:Python numbers

numbers.Integral是子类的numbers.Rational

这numbers.Rational,增加分子和分母的成员。

2

这是因为intrational的子类,而float不是。由于rational有分母属性,所以int继承它。

你可以阅读更多here

相关问题