Tvs (обсуждение | вклад) |
|||
(не показаны 3 промежуточные версии 2 участников) | |||
Строка 4: | Строка 4: | ||
При вычислении значений с помощью деления (например, НДС) получаются копейки, которые при последующем суммировании и округлении дают интересный эффект - сумма НДС по нескольким позициям может не равняться суммарному значению НДС, рассчитанному на основе общей суммы. | При вычислении значений с помощью деления (например, НДС) получаются копейки, которые при последующем суммировании и округлении дают интересный эффект - сумма НДС по нескольким позициям может не равняться суммарному значению НДС, рассчитанному на основе общей суммы. | ||
− | Для борьбы с этой проблемой применяется «банковское округление». Так же оно известно под следующими наименованиями: гауссово округление, | + | Для борьбы с этой проблемой применяется «банковское округление». Так же оно известно под следующими наименованиями: гауссово округление, бухгалтерское округление. |
Этот способ очень похож на математическое округление, за исключением следующего момента: если за последней значащей цифрой стоит 5, то последнюю цифру увеличивают, если она нечётная, и не изменяют, если чётная. | Этот способ очень похож на математическое округление, за исключением следующего момента: если за последней значащей цифрой стоит 5, то последнюю цифру увеличивают, если она нечётная, и не изменяют, если чётная. | ||
Строка 16: | Строка 16: | ||
=====Алгоритм===== | =====Алгоритм===== | ||
− | * если тысячные доли рубля меньше 5, то тысячные просто отбрасываются; | + | *если тысячные доли рубля меньше 5, то тысячные просто отбрасываются; |
− | * если тысячные доли рубля равны 5, а количество сотых четное, то тысячные просто отбрасываются; | + | *если тысячные доли рубля равны 5, а количество сотых четное, то тысячные просто отбрасываются; |
− | * в остальных случаях округляем вверх до сотых. | + | *в остальных случаях округляем вверх до сотых. |
<br /> | <br /> | ||
Строка 40: | Строка 40: | ||
|100.006 | |100.006 | ||
|100.01 | |100.01 | ||
− | |100. | + | |100.01 |
|- | |- | ||
|100.014 | |100.014 | ||
Строка 59: | Строка 59: | ||
|- | |- | ||
|100.025 | |100.025 | ||
+ | |100.03 | ||
|100.02 | |100.02 | ||
− | |||
|- | |- | ||
|100.026 | |100.026 | ||
Строка 71: | Строка 71: | ||
− | Пример реализации '''[https://replit.com/@AlieksieiSudnic/bank-rounding на php], [https://replit.com/@AlieksieiSudnic/bank-rounding-js на js]'''<br /> | + | Пример реализации '''[https://replit.com/@AlieksieiSudnic/bank-rounding-php#main.php на php], [https://replit.com/@AlieksieiSudnic/bank-rounding-js#index.js на js]'''<br /> |
Текущая версия на 10:11, 9 ноября 2022
Содержание
Банковское округление
Описание
При вычислении значений с помощью деления (например, НДС) получаются копейки, которые при последующем суммировании и округлении дают интересный эффект - сумма НДС по нескольким позициям может не равняться суммарному значению НДС, рассчитанному на основе общей суммы.
Для борьбы с этой проблемой применяется «банковское округление». Так же оно известно под следующими наименованиями: гауссово округление, бухгалтерское округление.
Этот способ очень похож на математическое округление, за исключением следующего момента: если за последней значащей цифрой стоит 5, то последнюю цифру увеличивают, если она нечётная, и не изменяют, если чётная.
Такой подход не снимает проблему округления полностью, а только значительно сокращает вероятность накопления ошибки за счет того, что количество «четных» и «нечетных» сумм статистически примерно одинаково. На практике такой точности вполне достаточно.
Этот алгоритм часто используется при расчетах в бухгалтерских системах - 1С, Комтет.
Алгоритм
- если тысячные доли рубля меньше 5, то тысячные просто отбрасываются;
- если тысячные доли рубля равны 5, а количество сотых четное, то тысячные просто отбрасываются;
- в остальных случаях округляем вверх до сотых.
Примеры округления
точное число | арифметическое
округление |
банковское
округление |
---|---|---|
100.004 | 100 | 100 |
100.005 | 100.01 | 100 |
100.006 | 100.01 | 100.01 |
100.014 | 100.01 | 100.01 |
100.015 | 100.02 | 100.02 |
100.016 | 100.02 | 100.02 |
100.024 | 100.02 | 100.02 |
100.025 | 100.03 | 100.02 |
100.026 | 100.03 | 100.03 |