问题:js浮点数运算时,莫名出现多位小数
原因:这是由于在运算的时候先把浮点数转化成二进制后进行运算,但是有的小数在二进制编码后出现无限循环,因而导致计算出现了误差,在其它变成语言中也有类似的问题。
console.log((0.1+0.2)==0.3)//false
console.log(0.1+0.2)//0.30000000000000004
console.log(0.22-0.12)//0.1 减法没有问题
console.log(0.1*0.2)//0.020000000000000004
console.log(0.1*3)//0.30000000000000004
console.log(1.2/0.3)//4 这样的除法没问题
console.log(1.2/3)//0.39999999999999997---能整除的除法
解决办法:
方法一:利用JavaScript 的toFixed(n) 方法,直接获取N 位小数
// var a=0.888888.toFixed(2);
// console.log(a);//0.89 toFixed方法是四舍五入的
// 所以这种方法存在精确度问题,,,但基本上说是可以使用的
console.log(0.1+0.2)//0.30000000000000004
var n=(0.1+0.2).toFixed(1);
console.log(n);//加法问题解决
console.log(0.1*0.2)//0.020000000000000004
var n=(0.1*0.2).toFixed(2);
console.log(n);//乘法问题1解决
console.log(0.1*3)//0.30000000000000004
var n=(0.1*3).toFixed(1);
console.log(n);//乘法问题2解决
console.log(1.2/3)//0.39999999999999997
var n=(1.2/3).toFixed(1);
console.log(n);//能整除的除法问题解决
console.log(0.1/3)
var n=(0.1/3).toFixed(3);
console.log(n);//不能整除的除法问题解决
方法二:自己编写算法---核心思想是先把小数转换成整数,在进行运算,从而规避浮点数运算
//自定义加法运算
function addFloatNum (num1, num2) {//核心思想是先把小数转换成整数
var sq1,sq2,m;
try {
sq1 = num1.toString().split(".")[1].length;//计算出小数点后有几位
}
catch (e) {
sq1 = 0;//小数点后没有东西,就默认为零位
}
try {
sq2 = num2.toString().split(".")[1].length;//计算出小数点后有几位
}
catch (e) {
sq2 = 0;//小数点后没有东西,就默认为零位
}
m = Math.pow(10,Math.max(sq1, sq2));//Math.pow() 10^2==100;2^3==8;,,,10 100 1000...
return (num1 * m + num2 * m) / m;
}
alert(addFloatNum(0.1, 0.2));//0.3
alert(addFloatNum(1, 2));//0.1
alert(addFloatNum(1, 0.2));//1.2
网友评论