Почему плавающие объекты в Python не имеют атрибута знаменателя, а int - нет? - PullRequest
5 голосов
/ 23 февраля 2012

Пока я возился с Python,

>>> [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 и не не для поплавка.

Любое объяснение этому?

Ответы [ 3 ]

5 голосов
/ 23 февраля 2012

Посмотрите на иерархию числовых классов: Числа Python

numbers.Integral является подклассом numbers.Rational

Это числа. Рациональное, которое добавляет члены числителя и знаменателя.

5 голосов
/ 23 февраля 2012

Это, скорее всего, потому, что числа с плавающей запятой несколько убыточны - они не могут точно представлять каждое значение.Рассмотрим этот пример:

>>> 1.0/5.0
0.20000000000000001

Если вы хотите получить доступ, знаменатель 1.0/5.0 python должен будет вернуть 18014398509481984 (20000000000000001/100000000000000000 == 3602879701896397/18014398509481984).Потеря точности приведет к тому, что у python не останется иного выбора, кроме как возвращать сумасшедшие значения, поэтому дизайнеры решили не реализовывать эту функцию.

2 голосов
/ 23 февраля 2012

Это потому, что int является подклассом rational, а float - нет. Поскольку rational имеет атрибут знаменателя, int унаследовал его.

Вы можете прочитать больше здесь

...