我正在使用JQuery,Stripes,Spring和JPA(Hibernate)构建一个webapp。
我有一个页面,允许用户输入多个订单行项目,每次onblur出现在价格字段中,我有一个JQuery事件绑定到该字段,它汇总了所有的价格字段(这是一个小计),计算10%税,并将税额添加到小计。我更新页面以显示小计,税金和总计。
我的问题是,我应该在Javascript中进行此计算吗?如果是这样,我怎样才能确保舍入等正常工作?我有点担心精确度问题。
在Java中进行Ajax调用是否会更好?
任何建议都会很棒!
根据经验,您需要衡量对您的应用程序重要的内容。如果它是绝对精度,则将其作为AJAX调用,因为浏览器,计算机和操作系统之间可能存在舍入差异。
当我为一家公司开发网站时,我正在为我工作时遇到同样的问题,但是我们设法通过使用仅使用整数算术的巧妙扭曲来使用javascript部分。
因为我们处理两位数的货币,我们将所有数字乘以10,000并进行计算。舍入为整数并除以10,000,将结果截断为两位小数。
这使得浏览器和服务器端之间的往返非常一致。
根据comp.lang.javascript FAQ,Javascript使用IEEE-754,因此在进行浮点数学运算时它的精度为15-16位。这对于货币操作应该足够了,前提是您在服务器端使用Javascript中的相同舍入。
但是如果您需要绝对确定它在任何和所有浏览器上都是正确的,那么Ajax调用将是最安全的操作。
如果您接受订单,我建议您在确认订单之前始终在服务器端进行计算,以避免有人恶意篡改从客户端发送的数据。也就是说,您可以使用JavaScript进行动态更新,并在准确性方面使用一些适当措辞的免责声明,然后在确认订单之前向用户提供服务器端计算。
Javascript不是最好的数学语言。你会发现一些数学表达式是真的,但在Javascript中返回false。记不起来,但是当我做一次计算器时,我发现了。
你可以在这里找到Javascript的好坏部分:http://www.crockford.com/
您应该使用后端(在您的Java情况下)进行严格的计算,因为无法保证最终用户不会将数据篡改为他们的利益。一旦您向他们发送了篡改价格的确认信息,即使您知道他们已经篡改了总价,您实际上也会受到购买合同条款的约束。没有简单的方法可以证明他们已经篡改了您的代码或计算,反过来也会不知所措。使用后端,您可以完全控制该环境,从该角度出现的任何错误或错误计算都可以直接归咎于您。
即使这不是一个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
它有很好的分数。