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

时间:2009-12-16 02:41:56

标签: javascript jquery ajax currency

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

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

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

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

任何建议都会很棒!

7 个答案:

答案 0 :(得分:15)

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

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

TamperIE篡改HTTP GET和POST的工具以及sandbox,您可以在其中使用

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

答案 4 :(得分:0)

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

您可以在此处了解Javascript的优缺点: http://www.crockford.com/

答案 5 :(得分:0)

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

答案 6 :(得分: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

它有很好的分数。