Почему 0.1 + 0.2 ≠ 0.3 или КОШМАР начинающего программиста

Цифровой мир и игры

Почему 0.1 + 0.2 ≠ 0.3 или КОШМАР начинающего программиста

Представьте ситуацию: вы пишете свой первый интернет-магазин или простой калькулятор скидок. Код идеален, логика безупречна. Но на этапе тестирования программа выдает странную ошибку: условие if 0.1 + 0.2 == 0.3: упорно возвращает False. Вы запускаете консоль, вводите сложение вручную и замираете в недоумении. На экране красуется: 0.30000000000000004.

В этот момент у любого новичка ломается картина мира. Математика первого класса начальной школы дает сбой внутри мощнейшего процессора компьютера. Что это? Баг в Python? Проблема в вашем процессоре? Или все цифровые технологии построены на обмане?

Не спешите переустанавливать операционную систему. С этой «магией» сталкиваются абсолютно все разработчики, независимо от того, пишут они на Python, JavaScript, C++ или Java. Дело здесь не в плохом коде, а в фундаментальных законах компьютерной арифметики.

В программировании (и в Python в частности) выражение 0.1 + 0.2 не равно 0.3 из-за особенностей представления вещественных чисел в памяти компьютера. Компьютеры используют двоичную систему счисления, в которой невозможно точно представить некоторые десятичные дроби.

Результат этого выражения в Python выглядит так:

python

>>> 0.1 + 0.2

0.30000000000000004

Компьютеры хранят числа с плавающей точкой в формате IEEE 754 (в виде двоичных дробей — 1/2, 1/4, 1/8, 1/16 и т.д.).

  • В десятичной системе невозможно точно записать дробь 1/3 — получается бесконечная периодическая дробь 0.33333....
  • В двоичной системе точно так же невозможно точно записать дроби 0.1 и 0.2 — они превращаются в бесконечные периодические двоичные дроби (0.0001100110011...).

Поскольку память компьютера ограничена (обычно 64 битами для типа float), бесконечная дробь округляется. При сложении двух слегка округленных чисел (0.1 и 0.2) погрешность накапливается, и на конце появляется крошечный "хвост" — та самая четверка в самом конце.

Как с этим работать в Python?

Если вам нужно сравнивать или точно вычислять такие числа, есть три основных решения:

1. Функция math.isclose() (для сравнения)

Никогда не сравнивайте float через оператор ==. Вместо этого проверяйте, насколько они близки друг к другу.

python

import math

print(math.isclose(0.1 + 0.2, 0.3)) # True

2. Модуль decimal (для точных расчетов)

Если вы пишете финансовое приложение, где округления недопустимы, передавайте числа в виде строк в класс Decimal.

python

from decimal import Decimal

result = Decimal('0.1') + Decimal('0.2')

print(result) # 0.3

print(result == Decimal('0.3')) # True

3. Функция round() (для красивого вывода)

Если нужно просто показать результат пользователю, округлите его до разумного количества знаков.

python

print(round(0.1 + 0.2, 10)) # 0.3

Парадокс 0.1 + 0.2 ≠ 0.3 — это не баг Python и не дефект вашего процессора. Это осознанный компромисс между скоростью вычислений и их точностью, на который инженеры пошли еще на заре компьютерной эры. Стандарт IEEE 754 позволяет процессору за наносекунды перемалывать миллионы чисел, но платой за эту скорость становится крошечная погрешность в триллионных долях.

Для большинства повседневных задач — будь то расчет физики в игре или отрисовка интерфейса — этот невидимый «хвост» ни на что не влияет. Но как только дело доходит до критически важных вычислений, ответственность ложится на плечи программиста.

Понимание того, как компьютер видит цифры «под капотом» — это как раз то, что отличает профессионального разработчика от любителя. Теперь, когда вы знаете секрет бесконечных двоичных дробей, этот загадочный хвост из нулей и четверки больше никогда не застанет вас врасплох.

Работает на 🌱kvitly Сила ИИ для вашего бизнеса