← Все вопросы

Про точность чисел

Задан 2 месяца назад37 просмотров2 ответа
1

Почему в Python 0.1 + 0.2 не равно 0.3, и в JS тоже самое? Это ошибка в калькуляторе? Как тогда правильно сравнивать дробные числа в коде?

2 ответа

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, а деньги хранят в копейках целыми числами. Копейки целыми — вообще хорошая привычка в любом языке.

1

Проверь ради интереса 0.1 + 0.2 в консоли браузера и в питоне - результат один и тот же. Это уровень процессора, а не языка. Калькулятор не сломан, он просто честно показал то, что другие программы округляют при выводе.

Ваш ответ

, чтобы ответить на вопрос.