js浮点数运算问题--莫名出现多位小数

问题: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

你可能感兴趣的:(js浮点数运算问题--莫名出现多位小数)