最近在做项目的时候,再用javascript进行小数运算的时候,发现了一个bug
console.log(3 * 0.8);
我发现3 * 0.8时并不能的到我想要得2.4的结果,得到的却是一个2.4000000000000004
仔细研究下发现,计算机的二进制遵循的是IEEE 754标准,其实小数在转为二进制时永远都是无穷的,这个bug其实就是说计算机底层转换为二进制时产生的,不仅仅是js,很多的语言都存在这个问题
例如:
php :
echo intval(0.58 * 100); // 57
得到的并不是我们想要的58,而是57
C# :
double a = 0.1;
double b = 0.2;
double c = 0.3;
Console.WriteLine(a + b == c); // false
得到是false,而非是true
下面来看下js的浮点型的问题:
js的所有数值在内存中都是占8个字节;
console.log(1.0); // 1,.0被去掉了
console.log(.1); // 0.1
console.log(0.1 + 0.2 == 0.3); // false
js最好不要判断俩个浮点数相加之和与另外一个浮点数是否相等;
如果想要判断的话可以用下面这个方法:
function judge (num1,num2) {
num1 = +num1;
num2 = +num2;
if (!isNaN(num1) && !isNaN(num2)) {
return num1.toFixed(10) == num2.toFixed(10);
} else {
throw("输入的类型错误");
}
}
console.log(judge(0.1 + 0.2,0.3)); // true
解决3 * 0.8的问题:
console.log(0.8 * 10 * 3 / 10); // 想将其转为整数在进行运算
console.log(+(0.8 * 3).toFixed(2));