js解决0.1+0.2==0.3的问题的几种方法

36次阅读

共计 847 个字符,预计需要花费 3 分钟才能阅读完成。

js 解决 0.1+0.2==0.3 的问题的几种方法
JavaScript 有 7 种基本类型分别是: Undefined, Null, Boolean, String, Number, Symbol, Object.
对于 JS 中的 Number 类型, 不区分整数和浮点数, 浮点数的精度远远不如整数, 首先先看一下为什么会出现这个问题, 根据双精度浮点数的定义, Number 类型的有效整数范围是 -0XFFFFFFFFFFF 至 0X1FFFFFFFFFF, 所以无法精确到超过这个范围的整数.
解决办法 1.ES6 提供的 Number.EPSILON 方法

function numbersequal(a,b){return Math.abs(a-b)<Number.EPSILON;
}
var a=0.1+0.2,b=0.3;
console.log(numbersequal(a,b)); //true
考虑兼容性的问题了,在 chrome 中支持这个属性,但是 IE 并不支持 (笔者的版本是 IE10 不兼容),所以我们还要解决 IE 的不兼容问题。
Number.EPSILON=(function(){// 解决兼容性问题
return Number.EPSILON?Number.EPSILON:Math.pow(2,-52);
})();
// 上面是一个自调用函数,当 JS 文件刚加载到内存中,就会去判断并返回一个结果,相比 if(!Number.EPSILON){
// Number.EPSILON=Math.pow(2,-52);
//} 这种代码更节约性能,也更美观。
function numbersequal(a,b){
return Math.abs(a-b)<Number.EPSILON;
}
// 接下来再判断
var a=0.1+0.2, b=0.3;
console.log(numbersequal(a,b)); // 这里就为 true 了

2. 把计算数字 提升 10 的 N 次方 倍 再 除以 10 的 N 次方。N 取决于浮点数有几位小数.
(0.1*1000+0.2*1000)/1000==0.3
//true

正文完
 0