相信下面一个方法是绝大多数人都会写到的
function judgeEqual(num1, num2, total) {
return num1 + num2 === total
}
然后如果单元测试为
judgeEqual(1, 2, 3); // true
judgeEqual(0.1, 0.2, 0.3); // false
其实这个问题我们在学JavaScript的时候就知道0.1 + 0.2 并不等于 0.3;因为二进制浮点数中的0.1跟0.2并不是十分精确,他们想加的结果并非等于0.3,而是一个比较接近的数字0.30000000000000004
;
那么我们应该怎么判断使得在JavaScript中让数学上的 0.1 + 0.2 = 0.3 成立呢
最常见的方法就是设置一个误差范围值,通常称之为“机器精度”, (machine epsilon),对JavaScript来说,这个值通常为2^-52
从ES6开始,该值定义在Number.EPSILON中,我们可以直接拿来用,也可以为ES6之前的版本写polyfill
if (!Number.ESPILON) {
Number.ESPILON = Math.pow(2, -52);
}
function numbersCloseEnoughToEqual(n1, n2) {
return Math.abs(n1 - n2) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3
numbersCloseEnoughToEqual(a, b); // true
本篇内容来源于《YOU DON'T KNOW JAVASCRIPT II》
打算做一个读书笔记,就这里开始吧