Почему 0,1 не помещается в двоичную запись

Компьютер хранит числа не в привычной десятичной системе, где разряды соответствуют степеням десяти, а в двоичной — с разрядами для степеней двух. Целые числа в ней обычно записываются точно, но многие конечные десятичные дроби при переводе превращаются в бесконечные двоичные последовательности. Например, дробь 0,1 в двоичной записи повторяется, подобно тому как 1/3 в десятичной системе выглядит как 0,333…

Память конечна, поэтому компьютер сохраняет лишь ограниченное число двоичных разрядов. Длинную последовательность округляют до ближайшего доступного значения. Число 0,2 тоже обычно хранится с небольшим округлением — и при сложении эти крошечные отклонения складываются. Отсюда и результат вроде 0,30000000000000004: это не ошибка сложения, а точный вывод приблизительных представлений чисел.

Почему это заметно не всегда

Формат числа с плавающей точкой — распространённый способ хранить значения с дробной частью — рассчитан на широкий диапазон чисел, а не на точное представление каждой десятичной дроби. Поэтому погрешность обычно ничтожна и при обычном выводе её скрывают: программа округляет результат до нескольких знаков после запятой. Но если показать внутреннее значение подробнее, добавочные цифры становятся видны.

Когда важна точная десятичная сумма

Для измерений и научных вычислений такие погрешности обычно учитывают при сравнении результатов: вместо проверки строгого равенства задают допустимую малую разницу. А в денежных расчётах, где важны именно десятичные доли, часто используют целые числа в минимальных денежных единицах или специальные десятичные форматы. Тогда сумма 0,1 и 0,2 может быть представлена ровно как 0,3 — без двоичного округления на каждом шаге.