Округление по правилам, вниз и вверх и проблема 0,1 + 0,2 — всё об округлении в калькуляторе
Чем различаются округление по правилам, отбрасывание (вниз) и округление вверх, как округляют денежные суммы, что такое банковское округление, почему в компьютере 0.1 + 0.2 = 0.30000000000000004 и как с этим работает этот калькулятор.
В процентных расчётах много деления и умножения на дроби, поэтому результат редко получается ровным. В зависимости от того, как обрабатывается дробная часть, один и тот же расчёт расходится на несколько копеек или центов. Зная правила, можно объяснить расхождения между чеком и коммерческим предложением.
Три способа округления
- Округление по правилам: если первая отбрасываемая цифра 5 и больше, округляют вверх, иначе — вниз. 1 234,5 → 1 235
- Отбрасывание (вниз): все отбрасываемые разряды просто убирают. 1 234,9 → 1 234
- Округление вверх: если отбрасываемая часть не равна 0, округляют вверх. 1 234,1 → 1 235
Можно менять и шаг. 12 345 с отбрасыванием до 10 даёт 12 340, а округление по правилам до 100 — 12 300.
Где что используют
- Сумма НДС в Южной Корее: на практике принято отбрасывать доли вона
- Уплата государственных налогов в Южной Корее: согласно статье 47 Закона об управлении государственными средствами суммы менее 10 вон не учитываются
- Цены со скидкой в магазинах: зависит от магазина, но сумму скидки часто отбрасывают до круглого значения
- Статистика и доли: обычно округляют по правилам до одного-двух знаков после запятой
- Необходимое количество (коробки, люди): нехватка недопустима, поэтому округляют вверх
Округление отрицательных чисел
−2,5 при округлении — это −3 или −2? Этот калькулятор округляет от нуля и выдаёт −3. Отбрасывание идёт к нулю (−1,239 → −1,23), округление вверх — от нуля. Иными словами, независимо от знака одно и то же правило применяется к модулю числа.
Банковское округление
Ровно половину (…5) округляют к ближайшему чётному (2,5 → 2, 3,5 → 4). Этот способ используют в некоторых бухгалтерских системах и языках программирования, чтобы уменьшить смещение при очень многократном округлении. В быту и в этом калькуляторе применяется обычное округление по правилам.
Почему в компьютере 0.1 + 0.2 = 0.30000000000000004
Компьютер хранит числа в двоичной системе. Так же как 1/3 в десятичной системе — бесконечная дробь 0,333…, число 0,1 в двоичной системе — бесконечная дробь, поэтому оно хранится не точно, а как очень близкое округлённое значение. Из-за этого в большинстве языков, включая JavaScript, 0.1 + 0.2 даёт 0.30000000000000004.
По той же причине распространённый способ округлить 1,005 до двух знаков (toFixed(2)) возвращает не 1,01, а 1,00: на самом деле 1,005 хранится как 1,00499999….
Как считает этот калькулятор
- Все промежуточные результаты приводятся к 12 значащим цифрам, чтобы убрать шум двоичного представления. 0,1 + 0,2 → 0,3
- Округление выполняется не умножением, а сдвигом разрядов в десятичной экспоненциальной записи. 1,005 → 1,01, 2,675 → 2,68
- Для денежных сумм на вкладках «Скидка» и «НДС» можно выбрать шаг (0,01, 1, 10, 100 и т. д.) и способ (вниз, по правилам, вверх).
- Этот способ проверен модульными тестами в node на граничных значениях (1,005, −2,5, очень малые и очень большие числа).
Отображаемые разряды и реальное значение
Настройка Знаков после запятой вверху меняет только число показываемых знаков. 1 ÷ 3 × 100 внутри равно 33,3333333333, а при 2 знаках отображается как 33,33. Кнопка «Копировать» копирует показанное значение.
Итог
Если результаты расходятся на несколько копеек из-за разных правил округления, это не ошибка, а разница в правилах. Если сумма не сходится, сначала проверьте: ① на каком этапе выполнялось округление и ② с каким шагом и каким способом.