背景
在开发过程中由于没考虑 java
中类型为 long
的字段通过 http
接口传到前端,会由于字段数据超过了 javascript
所能识别的最大值,因此会造成一定的精度丢失问题,具体请看:
基础知识
根据MDN中表示,javascript
有最大安全数和最小安全数的概念,即:
Number.MAX_SAFE_INTEGER
常量表示在JavaScript
中最大的安全整数(maxinum safe integer)(2^53 - 1)
以下表格为官方文档整理的一些关于 javascript
中 Number
对象的一些值的介绍:
属性 | 值 | 说明 |
---|---|---|
Number.MAX_SAFE_INTEGER | 2^53-1 | JavaScript中最大的安全整数 |
Number.MIN_SAFE_INTEGER | -(2^53-1) | JavaScript中最小的安全整数 |
Number.MAX_VALUE | 接近于1.79E+308 | 表示在JavaScript里所能表示的最大数值,大于 MAX_VALUE 的值代表 "Infinity" |
Number.MIN_VALUE | 接近于5e-324 | JavaScript中所能表示的最小的正值(最接近 0 的正值,而不是最小的负值),小于MIN_VALUE 的值将会转换为0 |
Number.NEGATIVE_INFINITY | 负无穷大 | Number.NEGATIVE_INFINITY 的值和全局对象的 Infinity 属性的负值相同 |
Number.POSITIVE_INFINITY | 正无穷大 | Number.POSITIVE_INFINITY 的值同全局对象 Infinity 属性的值相同 |
Number.EPSILON | 接近于2^-52(2.2204460492503130808472633361816E-16) | 1 与Number可表示的大于 1 的最小的浮点数之间的差值 |
解决办法
- 大数计算方式
- TC39提案中大数的实现
- 跟后端统一协调使用
string
类型的字段进行交互
应用场景
let a = 0.3 - 0.2; // a = 0.09999999999999998
let b = 0.2 - 0.1; // b = 0.1
console.log(a === b); // false
在涉及到金额数字的加减运算时,对于人民币而言最小单位是分,因此应该以分为单位,如:
amount = 100
表示1元钱,金额之间的算术运算就能避免以元为单位,在进行小数的四则运算而产生的偏差问题。 对于其他类型的货币亦是如此。