Вычисление/сравнение float и налоговая

от автора

Начну без прелюдий — когда сравниваются числа float (в любой системе или языке) в общем случае это делается с учетом погрешности вычислений. Вот нас в 90-е года в Университетах учили делать так:

if(abs($summ - $summ2) < 0.1){ // Суммы равны в учетом погрешности }

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

SELECT  ROUND(SUM(summ), 2) as summ1,         SUM(ROUND(summ, 2)) as summ2 FROM  ...

Особенно критично проблема проявляется в больших системах учета — нужно быть архи-внимательными с подобными расчетами. На больших цифрах и немалом количестве операций такие неточности достаточно сложно отлавливаются. Кроме того, в разных системах/языках принципы расчета float чисел может быть разным. Конечно, программисты с опытом знают о подобных вещах, но новички могут посчитать сумму на примере двух строк и думать, что «дело в шляпе». И будет хорошо, если проблема найдется раньше чем упадет ракета, взорвется АЭС или у кого-то по этой причине будут проблемы с надзорными органами..

Также есть большие вопросы к руководителям — если в вашей системе есть подобные вычисления, а качество подобных вычислений ведет к серьезным последствиям, то ваш профессиональный долг это предусмотреть и если невозможно решить, то максимально нивелировать возможные проблемы.

Ну, а теперь к главному — причем здесь налоговая, спросите вы? Вот два свежих скрина:

Может быть, конечно, я ошибаюсь в причинах произошедшего.. И, надеюсь, 1 апреля — это просто так случайно совпало 🙂


ссылка на оригинал статьи https://habr.com/ru/articles/896736/