js中Number类型表示数字,采用“IEEE 754 标准定义的双精度64位格式”表示数字,不区分整数值和浮点数值,均采用浮点数值表示,所以在进行数字运算的时候要特别之一进度缺失问题。
经典面试问题
js中0.1+0.2 == 0.3吗?
0.1 + 0.2 = 0.30000000000000004;
0.1 + 0.2 == 0.3; // false
那么如何判断两个浮点数直接相等呢?
1、精度判断法
var delta = 1e-5; // 定义精度精确到0.00001
var a = 0.1;
var b = 0.2;
var sum = 0.3;
// 判断相差小于精度就认为相等
if(a + b - sum < delta) {
console.log('a + b == sum');
}
2、使用toFixed()方法
toFixed()方法可以把Number四舍五入为指定小数的数字。
语法
NumberObject.toFixed(num); //num代表要保留的小数位数。
但是toFixe存在不精准的问题:
console.log(1.35.toFixed(1)); // 1.4 正确
console.log(1.335.toFixed(2)); // 1.33 错误
console.log(1.3335.toFixed(3)); // 1.333 错误
console.log(1.33335.toFixed(4)); // 1.3334 正确
console.log(1.333335.toFixed(5)); // 1.33333 错误
console.log(1.3333335.toFixede(6)); // 1.333333 错误
解决方法:
重写toFixed()方法:
Number.prototype.toFixed = function (s) {
var times = Math.pow(10, s);
//如果是正数,则+0.5,是负数,则-0.5
const adjust = this >= 0 ? 0.5 : -0.5;
var des = this * times + adjust;
des = parseInt(des, 10) / times;
return des + '';
}
console.log(1.335.toFixed(2)); // 1.34 正确
参考:
https://blog.csdn.net/undytk/article/details/88912386
https://blog.csdn.net/qq_33237207/article/details/81668457