Про точность чисел
Почему в Python 0.1 + 0.2 не равно 0.3, и в JS тоже самое? Это ошибка в калькуляторе? Как тогда правильно сравнивать дробные числа в коде?
2 ответа
Это не ошибка, а свойство формата, в котором процессор хранит дробные числа. И Python, и JS (и C, и Java) используют стандарт IEEE 754: число хранится в двоичной системе, а 0.1 в двоичке — бесконечная периодическая дробь, как 1/3 в десятичной. Её обрезают до 64 бит, и крошечный хвост погрешности остаётся. Отсюда 0.1 + 0.2 == 0.30000000000000004.
Как с этим жить:
# сравнивать с допуском
import math
math.isclose(0.1 + 0.2, 0.3) # True
# для денег — Decimal, он считает в десятичной системе
from decimal import Decimal
Decimal('0.1') + Decimal('0.2') # ровно 0.3
В JS сравнивают через Math.abs(a - b) < Number.EPSILON, а деньги хранят в копейках целыми числами. Копейки целыми — вообще хорошая привычка в любом языке.
Проверь ради интереса 0.1 + 0.2 в консоли браузера и в питоне - результат один и тот же. Это уровень процессора, а не языка. Калькулятор не сломан, он просто честно показал то, что другие программы округляют при выводе.