我正在使用JQuery,Stripes,Spring和JPA(Hibernate)构建一个webapp。
我有一个页面,允许用户输入多个订单行项目,每次onblur出现在price字段中,我有一个绑定到该字段的JQuery事件,它汇总了所有的价格字段(这是一个小计),计算10%的税,并将税额添加到小计。我更新页面以显示小计,税金和总计。
我的问题是,我应该在Javascript中进行此计算吗?如果是这样,我怎样才能确保舍入等正常工作?我有点担心精确度问题。
在Java中进行Ajax调用是否会更好?
任何建议都会很棒!
答案 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 != 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%,我肯定会建议阅读:
The Top 10 Things Wrong with JavaScript
它有很好的分数。