Компьютер обычно не может рассчитывать с десятичными числами на основание 10. Я не уверен, отличается ли он для квантового компьютера, но обычно числа рассчитываются внутренне для основания 2.
Без этого знания это может быть шокирующим моментом:
>>> 0.1 + 0.1 + 0.1 == 0.3
False
Это означает, что обычно используется приближение, чтобы получить хорошее представление об этих числах. Из-за этих приближений 0.1 + 0.1 + 0.1
не является 0.3
.
Так что простой 0.1
(основание 10) становится 0.0001 1001 1001 1001...
(основание 2, бесконечное). Но фракции для спасения и избавления от приближений! float.as_integer_ratio()
хочет быть точным:
Вернуть пару целых чисел, чье отношение точно равно к исходному значению с плавающей точкой и знаменателю.
(см. Python документация , выделено мое.)
Таким образом, метод использует алгоритм для вычисления точного отношения, например, из 0.1
и наилучших чисел, которые алгоритм может найдено 3602879701896397
и 36028797018963968
. Кажется, что числа хорошие, потому что библиотека фракций получает те же результаты (как вы сказали).
Кстати: все хорошо в базе 10, если вы рассчитываете десятичные числа, которые вы можете обрабатывать также в база 2, например 0.5
(= 0.1
на базу 2):
>>> 0.5.as_integer_ratio()
(1, 2)
Если вы хотите прочитать больше, есть также хороший сайт с множеством подробной информации и дальнейшими ссылками в Python учебники .