Angular JS对两个十进制数进行不准确的减法
Angular JS inaccurate substraction of two decimal numbers
在我的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中的浮点精度之前已经讨论过了。这里或这里)。您有以下选项:
- 将所有数字转换为整数
- 使用
.toFixed(2)
将结果格式化为固定数量的有效数字 - 为小数使用一个特殊的数据类型,如BigDecimal
在所有这些中,我同意@PerunSS的观点,在您的情况下,最好的选择是在任何操作之前将数字转换为整数,然后将它们转换回来。
相关文章:
- 为什么Angularjs服务返回的是字符数组而不是对象数组
- 如何生成十进制数
- 将一个十进制数转换成八分之一的分数
- JavaScript:不修改实际数组的函数
- JavaScript basis 是 math.pow 函数中的十进制数
- 下划线的 _.,但不排除以下数组中的子字符串
- 如何在不赋值数组变量的情况下读取数组数据
- JavaScript 在删除预上传图像时不清除图像数组
- Lodash 从与值数组不匹配的数组中获取项目
- 用于验证十进制数的正则表达式
- 在 JavaScript 中对音频文件进行计时不准确
- 如何使用 javascript 将浮点数格式化为十进制数(7)
- handontable:在不更改数据数组/对象的情况下隐藏某些列
- regex表示以0开头但不是十进制的数字
- 谷歌地图API-缩小时默认标记不准确
- 如何在javascript中输入十进制数
- 为什么不't数组(n).对于每个循环n次
- 在 sort() 之后,十进制数的 JavaScript 数组顺序不正确
- 输入字段不保存十进制数并将其设置为 ,00
- Angular JS对两个十进制数进行不准确的减法