Иногда, 1 копейка - это много!

Доброе время суток!

Возникла у меня в одном проекте из-за 1 копейки реальная проблема… Кажется, что такое копейка? Сегодня у нас и на гривну не много можно купить, а тут копейка! «К чему бы это он?», - спросите Вы. Объясню подробно.

В проекте, в разделе [Счета], используется двойное налогообложение продукта: Цена + НДС 20% + ННР 0,5% (или 0,1%). Попробуем математически рассчитать (округляем до второго знака после запятой):
Сумма с налогами: 300 грн
НДС 20%:
300*20/(100+20+0,5) = 49,79253112033195020746887966805
(49 грн 79 коп)
ННР 0,5%:
300*0,5/(100+20+0,5) = 1,2448132780082987551867219917012
(1 грн 24 коп)

Если мы воспользуемся стандартной функцией Math.Round() или System.Round() ( http://community.terrasoft.ua/node/1847 )
В поле ННР 0,5% увидим 1 грн 24 коп, что и стоило ожидать!

Но, внимание, если следовать расчетам бухгалтера (со ссылкой на 1С), то должно быть 1 грн 25 коп!!!
Вот эта одна копейка и испортила всю идиллию интересного проекта. Какая здесь логика?
1,2448 => 1,245 => 1,25

Прошу прощения, но тогда нужно начинать с бесконечности… А это, согласитесь, многовато.

Что бы угодить клиенту, пришлось наложить заплатку на расчет налогов:

Math.round(100* Math.round( TaxAmount *1000)/1000) / 100

М-да-а, вот такая история…
А у Вас бывали похожие казусы?

--
γνῶθι σεαυτόν

Нравится

Поделиться

8 комментариев

Так может ошибка в 1С :) Почему от точности 4 к точности 2 ножно идти через точность 3?

Если бы я только знал ПОЧЕМУ! :)

--
γνῶθι σεαυτόν

Тайна веков :) Ну, как говорится жираф большой, ему виднее :)

Вообще, отсутствие единого стандарта на округление - это извечная головная боль.

У всех свои алгоритмы, в итоге бывает очень сложно ввести приходную накладную, выписанную в другой системе.

При этом для бухгалтерии отклонение в 1 копейку - это свидетельство о возможном отклонение в миллион.

Копейка играет огромную роль в debt collection и составлении искового заявления. Если не сходятся суммы даже на копейку судья может отклонить дело по взысканию задолженности с неплательщика до предоставления "корректной информации"

Не знаю принципа расчета Вашей суммы в 1C и в бухгалтерии, почему получается итоговая сумма 1.25.
Предлагаю по своему опыту следующее решение проблемы - расчитывайте все налоги, а на последний налог отнесите сумму, равную разнице общей суммы налога и суммы уже расчитанных налогов. Недостающая копейка будет отнесена на последний налог.

Насколько мне известно в 1С бухгалтерии идет расчет сумм от цены без НДС. То есть на нее накручивается и НДС и налог на рекламу. Это соответствует методики выписки Налоговой накладной.
При попытке вести обратный расчет (от сумм с НДС) вполне может возникнуть данная проблема.

"Ковалишин Виталий aka samael" написал:1,2448 => 1,245 => 1,25
Что бы угодить клиенту, пришлось наложить заплатку на расчет налогов:
Math.round(100* Math.round( TaxAmount *1000)/1000) / 100

Это Вы созря. Могу почти гарантировать что 1С так не считает, разве что так написал какой-то безумный программист. А "Расчет налога на рекламу" как правило - это дописанные конфигурации.
Впрочем Вы сами можете посмотреть бизнесс-логику расчета в конфигурации 1С бухгалтерии. Она же есть открыта для просмотра.

Возможно, в общем Вы и правы, но в конкретном случае - другого варианта не было..

--
Cogito, ergo sum

Показать все комментарии