在完全JavaScript网络堆栈中,如何从十进制的货币来源转换时如何避免浮点错误



我最近必须设计一个货币处理应用程序,该应用程序完全在JavaScript,Express.js,Rest API,完整的节点/浏览器JS堆栈中。不幸的是,该应用程序处理了各种自定义计算,例如平均结果。当然,当平均结果时,浮点增加和除法就会发挥作用。因此,我会得到约0.12(12美分!(的值。

我了解理论上处理浮子的推荐选项:

  • 在整数中计算
  • 圆形
  • 在其他地方使用十进制数据类型

整数货币方法很好,这是有道理的,但是不幸的是,如果请求以十进制形式出现,那么某种将最初将浮子转换为整数的计算仍然必须发生,并且可能存在错误的潜力仍然保留。

因此,假设请求将44.67添加到美元值列表中。 在干净的整数单元中使用它会很高兴,但是要到达那里需要首先乘以100,我可疑会导致整个错误随附。

因此,在JavaScript中

在这种情况下,是需要数据库的,并且必须将值传递到数据库中?还是有一种方法可以将"无损"转换为JavaScript中的整数?或者在处理资金并需要精确性时还有其他技术吗?

问题中所述的问题的潜在错误来源包括:

  • 输入值如此之大,无法将100乘以100并将其四舍五入到最近的整数而不会出错。(这需要大约10 13 或更大的输入值,因此除非数据涉及数万亿美元,否则不可能。(
  • 执行的计算可能导致值如此之大,以至于发生舍入错误。
  • 输入中提到的"自定义计算"包括具有舍入错误的事物,即使值是小整数。例如,提到"平均",而没有四舍五入错误的情况下,平均1%,1%和2美分不能以二进制浮点数计算,因为4/3不可用。此外,"自定义计算"可以包括对数,概率分布的评估,集成和其他基本算术以外的数学。
  • 代码中可能有错误。

因此,在[JavaScript]中,处理避免浮点错误的小数或美元请求和计算之间的平滑转换过程是什么?

关于前者,如果 x 是十进制输入字符中的数字,则在小数点之后最多有两个数字,并且并不大(根据上述(,而 x是结果正确将该输入转换为JavaScript Number的过程,Math.round(100*x)的结果正好为100 x 。没有净舍入错误。任何计算错误的来源都位于其他地方。

最新更新