DamiRocK

Python: почему 0.1 + 0.2 печатается не как 0.3

Проверяем учебную сумму двух дробных цен и объясняем ограниченную точность двоичного float. Отличие вычисленного значения от его округлённого отображения.

Задание источника

В учебном примере два товара стоят 0,1 и 0,2 рубля. Выведите сумму в Python:

print(0.1 + 0.2)

При обычной двоичной реализации float результат печатается как 0.30000000000000004. Это демонстрация представления чисел, а не сведения о реальных ценах.

Откуда появляется разница

Числа 0,1 и 0,2 не имеют конечного двоичного разложения. В float сохраняются близкие представимые значения с ограниченной точностью, а сложение также округляется до представимого результата.

Не каждая дробь неточна: например, 0,5=1/2 имеет конечную двоичную запись. Поэтому объяснение «все дробные числа хранятся неправильно» было бы слишком сильным. Проблема зависит от конкретного числа и формата.

Вывод и значение — разные вещи

Можно отобразить результат с одним знаком после точки:

total = 0.1 + 0.2
print(f"{total:.1f}")  # 0.3

Это редакционное дополнение показывает форматирование. Оно не превращает исходный float в точную десятичную дробь и не устраняет все ошибки дальнейших расчётов.

Как подходить к точности

Для приближённых измерений сравнение обычно задают с обоснованным допуском. Для величин, которые должны быть точными в выбранной единице, можно использовать целые минимальные единицы или подходящий точный тип. Выбор зависит от требований задачи; слепое округление после каждого шага не является универсальным решением.

В исходном упражнении требуется именно увидеть обычное поведение суммы. Поэтому правильное учебное решение сохраняет print(0.1 + 0.2), а не подменяет его заранее написанной строкой "0.3".

Hexlet / Code Basics и участники · Исходный урок и решение · GNU AGPL v3. Адаптация; границы объяснения и пример формата уточнены.

Reading preferences

Appearance
Contrast
More options

Saved only in this browser. Your device’s reduced-motion setting is always respected. Browser zoom works throughout the site.