Задание источника
В учебном примере два товара стоят 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. Адаптация; границы объяснения и пример формата уточнены.