Арифметика

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

Это обращение поступило как обычно не вовремя, или вовремя, только я лишь не вовремя его просмотрел за утренней почтой. Раз есть ошибка и от меня зависит её скорейшее решение, значит придётся немного повременить с завтраком.

Совсем недавно, когда я ещё работал на работе, а не вернулся в свой домашний офис, я читал о том, какие козни строят работодатели в тестах для соискателей на должность программиста. Большинство людей валится на задачах, связанных с приоритетами математических операций. Я задумался. А не может ли быть и у меня подобная ошибка, связанная с неправильной расстановкой приоритетов?

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

Итак стоимость рассчитывается так: цена товара * курс ЦБ * ( 1 + процент риска поставщика / 100 )

Это же я ответил человеку, обратившемуся ко мне с ошибкой. На что получил ответ, что необходимо к курсу ЦБ прибавлять процент риска и только затем, рассчитывать стоимость товара в рублях, то есть должен быть приоритет для действия, в котором процент риска прибавляется к курсу ЦБ:

стоимость товара в рублях = цена товара * ( курс ЦБ + курс ЦБ * ( процент риска поставщика / 100 ) )

Тут-то я и вспомнил арифметику: приоритет выполнения всегда имеет действие, находящееся в скобках. Если рассуждать прямолинейно и логически, то мне правильно указали на ошибку, если не вспомнить что выполнение однородных действий (сложения или умножения) будет приводить к одному и тому же результату вне зависимости от порядка выполнения действий. То есть две формулы расчёта тождественно равны.

Я вижу, что ошибки с моей стороны в расчётах нет, и в техническом задании именно это и было утверждено. Но клиент недоволен, он сопит в трубку, топает ножкой. Начинается ловля блох.

Я логически пытаюсь объяснить что при перемножении чисел всегда будет один и тот же результат — не доходит. Начинаем разбирать первый пример. Мне называют цену 400, курс 44.35, процент 2… Вот здесь и разгадка. Цена у меня в базе не 400, а 430. Вот где, оказывается, было расхождение и арифметика здесь абсолютно не причём. Я с чувством гордости за свою чистую работу удалился завтракать.

На заметку тем, кто начнёт заниматься строительством своего интернет-магазина: цену лучше всего считать до её вывода из базы в код, благо MSSQL и MySQL позволяют это делать. Это снижает возможность влияния человеческого фактора при расчётах:

select …., IF( валюта != ’RUR’, цена товара * курс ЦБ * ( 1 + ( процент риска поставщика / 100 ) ), товара продукта (если рубли) ) as price …