我应该在Javascript中进行货币计算还是作为AJAX调用?

问题描述 投票:10回答:7

我正在使用JQuery,Stripes,Spring和JPA(Hibernate)构建一个webapp。

我有一个页面,允许用户输入多个订单行项目,每次onblur出现在价格字段中,我有一个JQuery事件绑定到该字段,它汇总了所有的价格字段(这是一个小计),计算10%税,并将税额添加到小计。我更新页面以显示小计,税金和总计。

我的问题是,我应该在Javascript中进行此计算吗?如果是这样,我怎样才能确保舍入等正常工作?我有点担心精确度问题。

在Java中进行Ajax调用是否会更好?

任何建议都会很棒!

javascript jquery ajax currency
7个回答
15
投票

根据经验,您需要衡量对您的应用程序重要的内容。如果它是绝对精度,则将其作为AJAX调用,因为浏览器,计算机和操作系统之间可能存在舍入差异。

当我为一家公司开发网站时,我正在为我工​​作时遇到同样的问题,但是我们设法通过使用仅使用整数算术的巧妙扭曲来使用javascript部分。

因为我们处理两位数的货币,我们将所有数字乘以10,000并进行计算。舍入为整数并除以10,000,将结果截断为两位小数。

这使得浏览器和服务器端之间的往返非常一致。


6
投票

根据comp.lang.javascript FAQ,Javascript使用IEEE-754,因此在进行浮点数学运算时它的精度为15-16位。这对于货币操作应该足够了,前提是您在服务器端使用Javascript中的相同舍入。

但是如果您需要绝对确定它在任何和所有浏览器上都是正确的,那么Ajax调用将是最安全的操作。


3
投票

如果您接受订单,我建议您在确认订单之前始终在服务器端进行计算,以避免有人恶意篡改从客户端发送的数据。也就是说,您可以使用JavaScript进行动态更新,并在准确性方面使用一些适当措辞的免责声明,然后在确认订单之前向用户提供服务器端计算。


2
投票

你应该在客户端这样做(我假设你有你的客户端验证器),这样用户就可以看到总数(我讨厌如果我们对服务器进行往返调用只看到总数)并且也这样做在服务器端。从POST中读取值不是一个好主意,因为如果你从HTTP POST中提取这些值,那么拥有HTTPProxy的人可以更改这些值。

TamperIE是一个篡改HTTP GET和POST以及sandbox的工具,你可以在其中玩耍

编辑:是的,您可以通过进行AJAX调用在服务器中进行计算,但是当用户提交订单时,您需要验证总计(根据产品数量+税)


0
投票

Javascript不是最好的数学语言。你会发现一些数学表达式是真的,但在Javascript中返回false。记不起来,但是当我做一次计算器时,我发现了。

你可以在这里找到Javascript的好坏部分:http://www.crockford.com/


0
投票

您应该使用后端(在您的Java情况下)进行严格的计算,因为无法保证最终用户不会将数据篡改为他们的利益。一旦您向他们发送了篡改价格的确认信息,即使您知道他们已经篡改了总价,您实际上也会受到购买合同条款的约束。没有简单的方法可以证明他们已经篡改了您的代码或计算,反过来也会不知所措。使用后端,您可以完全控制该环境,从该角度出现的任何错误或错误计算都可以直接归咎于您。


0
投票

即使这不是一个SO问题(我认为交换是更好的地方),我不会在算术计算中使用它,除非确实有要求。如果涉及小数点,则警报器会发出警报......

例如,你知道吗:

0.1 + 0.2 = 0.30000000000000004 

所以如果你真的检查为0.1 + 0.2 === 0.3它将是false

或者这里是更好的一个:

  • typeof NaN是数字NaN != NaNtrue。但NaN !== NaNtrue

这是我最喜欢的:

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%,我肯定会建议阅读:

The Top 10 Things Wrong with JavaScript

它有很好的分数。

© www.soinside.com 2019 - 2024. All rights reserved.