Angular JS对两个十进制数进行不准确的减法

Angular JS inaccurate substraction of two decimal numbers

本文关键字:不准确 十进制数 两个 JS Angular      更新时间:2023-09-26

在我的angular JS应用程序中,我在一个对象中有三个amount。在Chrome浏览器调试器我有以下:

付款。amountForClosing =付款。amountRemaining - payment.amountReserved;

付款。amountRemaining的值为3026.2

付款。amountreserve的值为2478.4

后减法付款。amountForClosing的值为547.7999999999997,显示547.8。当用户尝试进行另一次付款关闭时,我的验证逻辑返回一个错误,表明由于上述状态,没有足够的钱来进行付款关闭。

这些金额值来自c# WebApi 2.0后端,作为System。十进制类型。

在处理货币时,最糟糕的事情就是使用浮点数,正如您所看到的。由于浮点数的存储方式不同,一些操作可能会提供不正确的结果。唯一永远正确的是乘/除10的幂。

最好的方法是将货币存储为Integer/BigInteger或其他类型,并将其保存为例如小数点后4位,因此12100应该代表1.21

然后你可以做整数的减法/乘法,最后除以10的幂。

我的建议是在任何操作之前将这些数字转换为整数,然后将其除回浮点数

Javascript中的浮点精度之前已经讨论过了。这里或这里)。您有以下选项:

  1. 将所有数字转换为整数
  2. 使用.toFixed(2)
  3. 将结果格式化为固定数量的有效数字
  4. 为小数使用一个特殊的数据类型,如BigDecimal

在所有这些中,我同意@PerunSS的观点,在您的情况下,最好的选择是在任何操作之前将数字转换为整数,然后将它们转换回来。