通过javascript在客户端进行价格(十进制)计算是安全的吗?

通过javascript在客户端进行价格(十进制)计算是安全的吗?,javascript,.net,web,decimal,Javascript,.net,Web,Decimal,我必须操纵十进制计算。所有数据都已经在客户端,用户交互(选择)正在改变操作。所以我当然可以为每一个用户选择的变化去服务器,但这是一项耗时的工作和额外的复杂性 我开始在客户端处理十进制计算,并抛出全球化解析问题。我还担心服务器端的十进制计算可能不等于客户端的处理结果 因此,简单地说,最好在服务器端计算十进制值,或者仅仅为了显示而通过JavaScript计算十进制值没有任何问题?这就像在做加法时询问科学计算器是否比普通计算器好一样 是的,很好,但是要小心。JS有一个关于不精确小数的已知问题。据我所知

我必须操纵十进制计算。所有数据都已经在客户端,用户交互(选择)正在改变操作。所以我当然可以为每一个用户选择的变化去服务器,但这是一项耗时的工作和额外的复杂性

我开始在客户端处理十进制计算,并抛出全球化解析问题。我还担心服务器端的十进制计算可能不等于客户端的处理结果


因此,简单地说,最好在服务器端计算十进制值,或者仅仅为了显示而通过JavaScript计算十进制值没有任何问题?

这就像在做加法时询问科学计算器是否比普通计算器好一样

是的,很好,但是要小心。JS有一个关于不精确小数的已知问题。据我所知,人们用“分”(整数)计算,然后用100除以“美元”(浮点数/小数)


当然,您还应该在事后进行验证。众所周知,不能轻易相信客户端输入。

首先,在处理货币时,始终使用整数。如果你是用美元计算的,那么乘以100,用美分计算。无论您使用何种货币,请以尽可能小的金额为单位

这将消除任何舍入错误的机会

只有在得到最终值(单位为便士)后,才能将其除以100(或者更好地使用字符串操作),以最大精度表示


这将保证客户端和服务器得到相同的结果。

在服务器上,通常不需要使用整数,
十进制
就可以了。虽然在这种特定情况下,使用整数可以更容易地保持js和服务器代码的同步。使用较小的单位整数是一种解决方案,但可能并不总是可行的,例如,应用税收或折扣几乎总是引入浮动。另一个策略是让所有东西都保持浮动状态,最后只循环一次。当用于货币计算时,javascript浮动的不准确度很小(发生在第15位有效数字附近),并且在大多数情况下可以忽略,前提是使用一致的舍入算法。所有计算都必须在服务器上进行验证。