Открыть главное меню

Бухгалтерское округление

Описание

При вычислении значений с помощью деления (например, НДС) получаются копейки, которые при последующем суммировании и округлении дают интересный эффект - сумма НДС по нескольким позициям может не равняться суммарному значению НДС, рассчитанному на основе общей суммы.

Для борьбы с этой проблемой применяется «бухгалтерское округление». Так же оно известно под следующими наименованиями: гауссово округление, банковское округление.

Этот способ очень похож на математическое округление, за исключением следующего момента: если за последней значащей цифрой стоит 5, то последнюю цифру увеличивают, если она нечётная, и не изменяют, если чётная.

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

Этот алгоритм часто используется при расчетах в бухгалтерских системах - 1С, Комтет.

Алгоритм

- если тысячные доли рубля меньше 5, то тысячные просто отбрасываются;

- если тысячные доли рубля равны 5, а количество сотых четное, то тысячные просто отбрасываются;

- в остальных случаях округляем вверх до сотых.

Примеры:

0.56,       // bank: 0.56, math: 0.57
0.565335,   // bank: 0.56, math: 0.57
0.565335,   // bank: 0.56, math: 0.57
0.565335,   // bank: 0.56, math: 0.57
0.565335,   // bank: 0.56, math: 0.57


0.565783,   // bank: 0.56, math: 0.57
0.355532,   // bank: 0.36, math: 0.36
0.4557642,  // bank: 0.45, math: 0.45
0.345643,   // bank: 0.34, math: 0.35
0.235345,   // bank: 0.24, math: 0.24
0.285456,   // bank: 0.28, math: 0.29
0.225,      // bank: 0.22, math: 0.23
0.25527,    // bank: 0.26, math: 0.26
0.41525,    // bank: 0.42, math: 0.42
0.105,      // bank: 0.10, math: 0.11
0.115,      // bank: 0.12, math: 0.12

Пример реализации на php, на js