关于浮点数的一些问题

最近在做项目的时候,再用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)); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值