Строка 1: | Строка 1: | ||
− | == Бухгалтерское | + | == Бухгалтерское округление == |
+ | |||
+ | Описание | ||
+ | |||
При вычислении значений с помощью деления (например, НДС) получаются копейки, которые при последующем суммировании и округлении дают интересный эффект - сумма НДС по нескольким позициям может не равняться суммарному значению НДС, рассчитанному на основе общей суммы. | При вычислении значений с помощью деления (например, НДС) получаются копейки, которые при последующем суммировании и округлении дают интересный эффект - сумма НДС по нескольким позициям может не равняться суммарному значению НДС, рассчитанному на основе общей суммы. | ||
− | Для борьбы с этой проблемой применяется «бухгалтерское | + | Для борьбы с этой проблемой применяется «бухгалтерское округление». Так же оно известно под следующими наименованиями: гауссово округление, банковское округление. |
+ | |||
+ | Этот способ очень похож на математическое округление, за исключением следующего момента: если за последней значащей цифрой стоит 5, то последнюю цифру увеличивают, если она нечётная, и уменьшают, если чётная. | ||
− | Алгоритм | + | Такой подход не снимает проблему округления полностью, а только значительно '''''сокращает вероятность накопления ошибки''''' за счет того, что количество «четных» и «нечетных» сумм статистически примерно одинаково. На практике такой точности вполне достаточно. |
+ | |||
+ | Этот алгоритм часто используется при расчетах в бухгалтерских системах - 1С, Комтет. | ||
+ | |||
+ | Алгоритм | ||
- если тысячные доли рубля меньше 5, то тысячные просто отбрасываются; | - если тысячные доли рубля меньше 5, то тысячные просто отбрасываются; | ||
Строка 13: | Строка 22: | ||
Примеры: | Примеры: | ||
+ | <pre> | ||
+ | 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.105, // bank: 0.10, math: 0.11 | ||
+ | 0.115, // bank: 0.12, math: 0.12 | ||
+ | </pre> | ||
− | + | Пример реализации функции на php: | |
− | |||
− | |||
− | |||
− | |||
− | |||
+ | <pre> | ||
function bank_round ($val) | function bank_round ($val) | ||
− | |||
{ | { | ||
− | + | $tmp = intval (abs ($val) * 100); | |
− | $tmp = intval (abs ($val) * 100); | + | if ($tmp % 2 != 0) $tmp +=1; |
− | + | if ($val < 0) $tmp = 0 - $tmp; | |
− | if ($tmp % 2 != 0) $tmp +=1; | + | return $tmp / 100; |
− | |||
− | if ($val < 0) $tmp = 0 | ||
− | |||
− | return $tmp / 100; | ||
− | |||
} | } | ||
+ | </pre> | ||
<br /> | <br /> |
Версия 11:47, 2 ноября 2022
Бухгалтерское округление
Описание
При вычислении значений с помощью деления (например, НДС) получаются копейки, которые при последующем суммировании и округлении дают интересный эффект - сумма НДС по нескольким позициям может не равняться суммарному значению НДС, рассчитанному на основе общей суммы.
Для борьбы с этой проблемой применяется «бухгалтерское округление». Так же оно известно под следующими наименованиями: гауссово округление, банковское округление.
Этот способ очень похож на математическое округление, за исключением следующего момента: если за последней значащей цифрой стоит 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:
function bank_round ($val) { $tmp = intval (abs ($val) * 100); if ($tmp % 2 != 0) $tmp +=1; if ($val < 0) $tmp = 0 - $tmp; return $tmp / 100; }