在进行计算时javascript可以被信任吗?

在进行计算时javascript可以被信任吗?,javascript,floating-point-precision,Javascript,Floating Point Precision,我正在实现一个invoice系统,其中所有内容都通过javascript动态添加到dom中,并且我正在使用javascript对浏览器本身进行一些计算。 例如,我用单位的数量和价格计算每个发票行,并生成一个总金额 价格可以是浮点数 但我不确定这是否值得信任,如果有人对javascript有同样的看法,请评论:) 我不知道,但javascript在我看来不像PHP之类的其他编程语言那样值得信任,这是我的观点,但如果你能说服我,请相信我 感谢您,Javascript使用的数据类型与几乎所有语言用于浮

我正在实现一个invoice系统,其中所有内容都通过javascript动态添加到dom中,并且我正在使用javascript对浏览器本身进行一些计算。 例如,我用单位的数量和价格计算每个发票行,并生成一个总金额

价格可以是浮点数

但我不确定这是否值得信任,如果有人对javascript有同样的看法,请评论:)

我不知道,但javascript在我看来不像PHP之类的其他编程语言那样值得信任,这是我的观点,但如果你能说服我,请相信我


感谢您,Javascript使用的数据类型与几乎所有语言用于浮点计算的数据类型相同。双精度浮点数据类型非常常见,因为处理器内置了对它的支持

浮点数的精度有限,大多数小数部分的数字无法精确表示。但是,对于您将要使用它的目的,精度足以显示正确的结果


你应该意识到精度有限。显示结果时,应确保其格式(并四舍五入)达到您希望显示的精度。否则,有限的精度可能会显示为例如
14.9500000000000001
的价格,而
14.95

Javascript使用几乎所有语言用于浮点计算的相同数据类型。双精度浮点数据类型非常常见,因为处理器内置了对它的支持

浮点数的精度有限,大多数小数部分的数字无法精确表示。但是,对于您将要使用它的目的,精度足以显示正确的结果

你应该意识到精度有限。显示结果时,应确保其格式(并四舍五入)达到您希望显示的精度。否则,有限精度可能显示为例如
14.9500000000000001
的价格,而不是
14.95

根据,所有数字都是64位精度(如64位浮点精度)

从中,您有3种解决方案:

  • 在JavaScript中使用一些十进制实现,如
  • 只需选择一个固定数量的数字来保存,就像这样
    (Math.floor(y/x)*x)。toFixed(2)
  • 切换到纯整数,将价格视为美分数。这可能会导致整个项目发生重大变化
  • 根据,所有数字都是64位精度(如64位浮点精度)

    从中,您有3种解决方案:

  • 在JavaScript中使用一些十进制实现,如
  • 只需选择一个固定数量的数字来保存,就像这样
    (Math.floor(y/x)*x)。toFixed(2)
  • 切换到纯整数,将价格视为美分数。这可能会导致整个项目发生重大变化

  • 其他答案解决了JavaScript使用浮点数表示货币的问题

    使用JavaScript进行涉及金融交易的计算还有一个单独的问题。 由于代码是在客户端计算机上的浏览器中执行的,因此只能在信任客户端的程度上信任结果

    因此,如果客户告诉您,您应该只依赖JavaScript来计算一些您认为理所当然的东西。 例如,如果你在写一个电子商务网站,你可以相信告诉你客户想买什么、客户送货地址是什么的代码,但你需要自己计算商品的价格,以防止客户告诉你更低的价格

    您正在使用的发票系统完全有可能只在您的组织内部使用。 如果是这样,你可以忽略整个答案。
    但是,如果你的应用程序将被客户用来访问和操作他们的发票和订单,那么这是你必须考虑的事情。 其他答案解决了JavaScript使用浮点数表示货币的问题

    使用JavaScript进行涉及金融交易的计算还有一个单独的问题。 由于代码是在客户端计算机上的浏览器中执行的,因此只能在信任客户端的程度上信任结果

    因此,如果客户告诉您,您应该只依赖JavaScript来计算一些您认为理所当然的东西。 例如,如果你在写一个电子商务网站,你可以相信告诉你客户想买什么、客户送货地址是什么的代码,但你需要自己计算商品的价格,以防止客户告诉你更低的价格

    您正在使用的发票系统完全有可能只在您的组织内部使用。 如果是这样,你可以忽略整个答案。
    但是,如果你的应用程序将被客户用来访问和操作他们的发票和订单,那么这是你必须考虑的事情。 财务计算通常需要特定的固定规则,例如何时以及如何取整(向哪个方向)等。
    这意味着您将经常保持内部小计精度,直到您转到计算的下一部分(如根据规则集添加税款)

    IEEE-754浮点(在javascript中使用)将为您提供最大精度
    2^53
    (如果您将其视为整数)。
    现在,您的“任务”是假装javascript不支持浮点,并使用最简单的方法替换它:将最大整数范围减小到0