Откуда эти цифры в значении Python?

В математике значение 1/3 составляет 0,333 (от 3 до бесконечности).

Тем не менее, Python печатает неправильные цифры на хвосте.

print(f"{1/3:.100f}".rstrip("0"));
print(f"{1/3:.100f}");

Результат:

0,333333333333333314829616256247390992939472198486328125

Результат (без полос):

0,3333333333333333148296162562473909929394721984863281250000000000000000000000000000000000000000000000

Откуда эти цифры (не 3)?

Всего 2 ответа


Из документов

Числа с плавающей запятой представлены в компьютерном оборудовании в виде двоичных (двоичных) дробей

Для десятичных дробей, которые нельзя представить как двоичные дроби (например, повторяющиеся десятичные дроби), они аппроксимируются двоичной дробью до предела точности:

Остановитесь на любом конечном количестве битов, и вы получите приближение. На большинстве современных машин числа с плавающей точкой аппроксимируются двоичной дробью, а числитель - первыми 53 битами [...]

Следовательно, 1/3. хранится не как 0.333.... (повторяется), а как приближение (якобы 53-битная двоичная дробь).


Когда вы добавляете более точные значения, python вычисляет число ближе к фактическому значению. Подумайте об этом так, используя 1/3:

0.3

или

0.33

или

0.333

«Независимо от того, сколько цифр вы хотите записать, результат никогда не будет ровно 1/3, но будет все более приближенным к 1/3».


Есть идеи?

10000