Должен ли я делать расчеты денег в Javascript или как вызов AJAX? - PullRequest
10 голосов
/ 16 декабря 2009

Я создаю веб-приложение, используя JQuery, Stripes, Spring и JPA (Hibernate).

У меня есть страница, которая позволяет пользователям вводить несколько позиций строки заказа, и каждый раз, когда onblur происходит в поле цены, у меня есть событие JQuery, связанное с полем, которое суммирует все поля цены (это промежуточный итог), рассчитывает 10% налог и добавляет налог к ​​промежуточной сумме. Я обновляю страницу для отображения промежуточных итогов, налога и итоговой суммы.

У меня вопрос, должен ли я делать эти вычисления в Javascript? Если так, как я могу быть уверен, что округление и т. Д. Работает правильно? Я немного беспокоюсь о проблемах с точностью.

Было бы лучше, если бы я сделал Ajax-вызов для вычисления в Java?

Любой совет был бы великолепен!

Ответы [ 7 ]

15 голосов
/ 16 декабря 2009

Как правило, вам нужно измерить то, что важно для вашего приложения. Если это абсолютная точность, сделайте это как вызов AJAX, потому что между браузерами, компьютерами и ОС могут быть различия в округлении.

Когда я разрабатывал сайт для компании, в которой работал, у меня была та же проблема, однако нам удалось использовать часть javascript, используя хитрый поворот, используя только целочисленную арифметику.

Поскольку мы имели дело с валютой с двумя цифрами, мы умножили все на 10000 и сделали расчеты. Округление до целого числа и деление на 10 000, усечение результата до двух десятичных знаков.

Это обеспечивает правильное и согласованное взаимодействие между браузером и сервером.

6 голосов
/ 16 декабря 2009

Согласно comp.lang.javascript FAQ , Javascript использует IEEE-754 и поэтому имеет точность 15-16 цифр при выполнении математических операций с плавающей запятой. Этого должно быть достаточно для денежных операций, при условии, что в Javascript используется то же округление, что и на стороне сервера.

Но если вам нужно быть абсолютно уверенным, что это правильно во всех браузерах, вызов Ajax будет самым безопасным способом действий.

3 голосов
/ 16 декабря 2009

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

2 голосов
/ 16 декабря 2009

Вы должны сделать это на стороне клиента (я предполагаю, что у вас есть свои валидаторы на стороне клиента), чтобы пользователь мог видеть итоговое значение (я бы не хотел, если бы мы совершали вызовы в оба конца на сервер, чтобы просто увидеть итоговое значение) также сделайте это на стороне сервера. Считывание значений из POST было бы не очень хорошей идеей, так как кто-то с HTTPProxy мог изменить эти значения, если вы выбираете его из своего HTTP POST.

TamperIE инструмент для изменения HTTP GET и POST и песочница , где вы можете поиграть с

Редактировать: Да, вы можете выполнить расчет на сервере, сделав вызов AJAX, но вам необходимо будет проверить сумму в любом случае (по количеству продуктов + налог), когда пользователь отправляет заказ

0 голосов
/ 04 марта 2018

Несмотря на то, что это не вопрос SO (обмен лучше, я думаю), я не использовал бы его в арифметических вычислениях, если бы не было действительно необходимости. Если вводятся десятичные точки, сирены встревожены ...

Например, знаете ли вы, что:

0.1 + 0.2 = 0.30000000000000004 

, так что если вы действительно отметите как 0.1 + 0.2 === 0.3, это будет false

Или вот лучший:

  • typeof NaN является числом NaN != NaN является true. НО NaN !== NaN также true

А вот мой любимый:

var i = 1;
i = i + ""; 
i + 1 //output will be "11" :) 
console.log(i);//output will be 1 
i - 1 = 0; // this part is the golden shot 

Даже если я не согласен на 100% со следующей статьей, я бы определенно предложил прочитать:

10 лучших вещей с JavaScript

У него действительно хорошие очки.

0 голосов
/ 16 декабря 2009

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

0 голосов
/ 16 декабря 2009

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

Вы можете узнать о хороших и плохих частях Javascript здесь: http://www.crockford.com/

...