在进行计算时javascript可以被信任吗?
我正在实现一个invoice系统,其中所有内容都通过javascript动态添加到dom中,并且我正在使用javascript对浏览器本身进行一些计算。 例如,我用单位的数量和价格计算每个发票行,并生成一个总金额 价格可以是浮点数 但我不确定这是否值得信任,如果有人对javascript有同样的看法,请评论:) 我不知道,但javascript在我看来不像PHP之类的其他编程语言那样值得信任,这是我的观点,但如果你能说服我,请相信我在进行计算时javascript可以被信任吗?,javascript,floating-point-precision,Javascript,Floating Point Precision,我正在实现一个invoice系统,其中所有内容都通过javascript动态添加到dom中,并且我正在使用javascript对浏览器本身进行一些计算。 例如,我用单位的数量和价格计算每个发票行,并生成一个总金额 价格可以是浮点数 但我不确定这是否值得信任,如果有人对javascript有同样的看法,请评论:) 我不知道,但javascript在我看来不像PHP之类的其他编程语言那样值得信任,这是我的观点,但如果你能说服我,请相信我 感谢您,Javascript使用的数据类型与几乎所有语言用于浮
感谢您,Javascript使用的数据类型与几乎所有语言用于浮点计算的数据类型相同。双精度浮点数据类型非常常见,因为处理器内置了对它的支持 浮点数的精度有限,大多数小数部分的数字无法精确表示。但是,对于您将要使用它的目的,精度足以显示正确的结果
你应该意识到精度有限。显示结果时,应确保其格式(并四舍五入)达到您希望显示的精度。否则,有限的精度可能会显示为例如
14.9500000000000001
的价格,而14.95
Javascript使用几乎所有语言用于浮点计算的相同数据类型。双精度浮点数据类型非常常见,因为处理器内置了对它的支持
浮点数的精度有限,大多数小数部分的数字无法精确表示。但是,对于您将要使用它的目的,精度足以显示正确的结果
你应该意识到精度有限。显示结果时,应确保其格式(并四舍五入)达到您希望显示的精度。否则,有限精度可能显示为例如14.9500000000000001
的价格,而不是14.95
根据,所有数字都是64位精度(如64位浮点精度)
从中,您有3种解决方案:
(Math.floor(y/x)*x)。toFixed(2)
(Math.floor(y/x)*x)。toFixed(2)
其他答案解决了JavaScript使用浮点数表示货币的问题 使用JavaScript进行涉及金融交易的计算还有一个单独的问题。 由于代码是在客户端计算机上的浏览器中执行的,因此只能在信任客户端的程度上信任结果 因此,如果客户告诉您,您应该只依赖JavaScript来计算一些您认为理所当然的东西。 例如,如果你在写一个电子商务网站,你可以相信告诉你客户想买什么、客户送货地址是什么的代码,但你需要自己计算商品的价格,以防止客户告诉你更低的价格 您正在使用的发票系统完全有可能只在您的组织内部使用。 如果是这样,你可以忽略整个答案。
但是,如果你的应用程序将被客户用来访问和操作他们的发票和订单,那么这是你必须考虑的事情。 其他答案解决了JavaScript使用浮点数表示货币的问题 使用JavaScript进行涉及金融交易的计算还有一个单独的问题。 由于代码是在客户端计算机上的浏览器中执行的,因此只能在信任客户端的程度上信任结果 因此,如果客户告诉您,您应该只依赖JavaScript来计算一些您认为理所当然的东西。 例如,如果你在写一个电子商务网站,你可以相信告诉你客户想买什么、客户送货地址是什么的代码,但你需要自己计算商品的价格,以防止客户告诉你更低的价格 您正在使用的发票系统完全有可能只在您的组织内部使用。 如果是这样,你可以忽略整个答案。
但是,如果你的应用程序将被客户用来访问和操作他们的发票和订单,那么这是你必须考虑的事情。 财务计算通常需要特定的固定规则,例如何时以及如何取整(向哪个方向)等。
这意味着您将经常保持内部小计精度,直到您转到计算的下一部分(如根据规则集添加税款) IEEE-754浮点(在javascript中使用)将为您提供最大精度
2^53
(如果您将其视为整数)。现在,您的“任务”是假装javascript不支持浮点,并使用最简单的方法替换它:将最大整数范围减小到0