Вопрос. Почему результат расчета, производимого в информационной системе Фонда, иногда отличается на одну или несколько копеек от результатов расчета в большинстве распространенных бухгалтерских программ? Почему Вы не можете сделать, чтобы ваш результат расчета совпал с результатами расчета в большинстве распространенных бухгалтерских программ? Почему в промежуточных вычислениях ваши программы показывают и используют более двух знаков после запятой при том, что все расчеты должны вестись в рублях и копейках, т. е. с точностью до двух знаков после запятой, и не в этом ли кроется причина расхождений?
Ответ. Задача расчета пособия Фондом состоит не в том чтобы СОШЛОСЬ с расчетом в какой-либо популярной бухгалтерской программе, а в том, чтобы посчитать ПРАВИЛЬНО. В большинстве, если не во всех популярных (и распространенных) бухгалтерских программах не учитываются правила приближенных вычислений, в связи с чем теряются значащие разряды в промежуточных вычислениях, т. е. теряется требуемая точность вычисления, что и приводит к потере одной или нескольких копеек.
Так как вопрос с копейками поднимается постоянно, попробуем рассмотреть вопрос применения правил приближенного вычисления более подробно.
Изучение и применение правил приближенного вычисления входило в программу обучения 8 или 9-го класса средней школы в 80-х годах прошлого века, возможно, что входит в программу обучения и в настоящее время. В любом случае о приближенных вычислениях можно также прочитать в книге Я.И.Перельмана «Занимательная арифметика», например здесь:www.perelman100.narod.ru/?gl8.htm
Цитируем:
Итак, все правила приближенных вычислений могут быть при выполнении расчетов сведены к двум следующим:
1) устанавливают, сколько значащих цифр в самом коротком из данных задачи: столько же значащих цифр нужно будет удержать в окончательном результате;
2) в результатах всех промежуточных вычислений удерживают одной цифрой больше, чем установлено для окончательного результата.
Прочие цифры во всех случаях заменять нолями или отбрасывать по правилам округления.
конец цитаты.
Попробуем применить на практике.
Определимся с точностью (количеством значащих разрядов) исходных данных.
Предположим, что значение начисленной (выплаченной) работнику зарплаты за период дано с округлением до копеек S = RRRRR,KK, т.е. оно не точное а приближенное. В данном случае число содержит 7 значащих разрядов.
Период измеряется в целых днях, обозначим его как D. Это число точное, т. е. содержит не меньше значащих разрядов, чем любое из участвующих в вычислениях приближенное число.
Легко заметить (в силу правила 1), что при делении и умножении на абсолютно точное число, количество значащих разрядов в результате будет равно количеству значащих разрядов в исходном числе. Для примера будем считать D = 100, тогда среднедневная зарплата за период Z = S/D = RRR,RRKK имеет те же 7 значащих разрядов. Так как среднедневная зарплата это всего лишь понятие для именования промежуточного результата (т.е. ее не выплачивают ежедневно кому-либо в реальных рублях и копейках), то по правилу 2, в промежуточном вычислении надо оставить на 1 разряд больше. Таким образом, промежуточное значение среднедневной зарплаты необходимо показывать и, главное, использовать в дальнейших расчетах (для описываемого примера) с точностью в 8 разрядов, т.е. Z = RRR,RRKK0.
Так как в общем случае значение D не круглое, то и в промежуточном расчете цифра в дополнительном разряде в общем случае не будет нулем.
Далее, находим сумму пособия P = Z * N, где N — число дней, на которые рассчитывается пособие, точное и целое число, для примера возьмем его равным 10. Тогда P = RRR,RRKK0 * 10 = RRRR,RKK0. Так как полученное значение уже не промежуточный, а искомый нами результат, то от него следует отбросить все незначащие цифры, в данном случае последний разряд. Таким образом, вычислено пособие с точностью до 0.1 копейки (в нашем примере). Но так как пособие выдается в реальных рублях и копейках, то полученный результат округляем до требуемой величины, т.е. до RRRR,RL, где L зависит от того, больше 5 была цифра в третьем знаке после запятой или нет (правило округления).
Сколько необходимо использовать знаков после запятой в промежуточном результате зависит, вообще говоря, от количества значащих разрядов в приближенном значении исходного числа и от значения делителя (в нашем примере).Заметим, что значащие разряды и количество цифр после десятичной запятой - это совсем не одно и то же.
Докажем, что использование точности до двух знаков после запятой в промежуточных вычислениях, как это делается в большинстве популярных и распространенных бухгалтерских программ, ведет к неправильному результату.
Для этого воспользуемся известными из курса начальной школы переместительным и сочетательным законами (свойствами) умножения.
Теория:
Переместительный закон умножения: ab = ba.
Сочетательный закон умножения: (ab)с = a(bc).
ПРАВИЛЬНЫЙ расчет должен удовлетворять вышеприведенным законам, т.е. сумма пособия P, вычисленная по формулам
P = (S/D)*N (1)
и
P = (N*S)/D (2),
должна давать одинаковый результат при любых S, D, N,
где S - сумма выплат за период, D - календарных дней в периоде, N — дней, за которые необходимо рассчитать пособие к выплате.
Чтобы доказать неправильность расчета, достаточно привести хотя бы один пример, для которого формулы 1 и 2 дают разный результат.
Пример:
Пусть за предыдущий период (например, D = 365 дней) работодателем были произведены выплаты (начисления) застрахованному в сумме 182518 рублей 03 копейки (S = 182518,03). Необходимо рассчитать пособие за N = 10 дней.
Считаем с округлением промежуточного результата до копеек, т. е. до 2-х знаков после запятой:
1. P = (S/D)*N: P = (182518,03/365)*10 = 500,05 * 10 = 5000 р. 50 коп.
2. P = (N*S)/D: P = (10 * 182518,03)/365 = 1825180,3/365 = 5000 р. 49 коп.
Если бы количество дней в пособии было не 10, а, например 20, 50, 100 или 200, то ошибка составила бы соответственно 2, 5, 10 или 20 копеек.
Таким образом, строго доказано, что расчет с округлением промежуточного результата до копеек не удовлетворяет основным законам для умножения и, следовательно, является неправильным.
И можно даже сказать почему: потому что при округлении промежуточного результата происходит потеря значащих разрядов (в примере потеряно три значащих разряда и один полузначащий). Об этом и было сказано в коротком ответе на вопрос в самом начале.
Можно убедиться что те же данные при использовании правил приближенного вычисления не приводят к нарушению законов умножения:
1. P = (S/D)*N: P = (182518,03/365)*10 = 500,049397 * 10 = 5000,49397 = 5000 р. 49 коп.
2. P = (N*S)/D: P = (10 * 182518,03)/365 = 1825180,30/365 = 5000,49397 = 5000 р. 49 коп.
В заключение заметим, что на самом деле сумма выплат S известна точно, т. е. это точное число выплаченных сотруднику рублей и копеек, и с этой точки зрения приближенность данного числа определяется ограниченностью количества разрядов, предназначенных для хранения числа с плавающей точкой в памяти компьютера, т. е. около 15 значащих десятичных разрядов
Очередной перл ФСС
отсюда