javascript中的精度问题

321 阅读2分钟

背景

在开发过程中由于没考虑 java 中类型为 long 的字段通过 http 接口传到前端,会由于字段数据超过了 javascript 所能识别的最大值,因此会造成一定的精度丢失问题,具体请看:

基础知识

根据MDN中表示,javascript最大安全数最小安全数的概念,即:

Number.MAX_SAFE_INTEGER 常量表示在 JavaScript 中最大的安全整数(maxinum safe integer)(2^53 - 1)

以下表格为官方文档整理的一些关于 javascriptNumber 对象的一些值的介绍:

属性 说明
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 的最小的浮点数之间的差值

解决办法

应用场景

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元钱,金额之间的算术运算就能避免以元为单位,在进行小数的四则运算而产生的偏差问题。 对于其他类型的货币亦是如此。