Javascript里的浮点数

今天做需求的时候碰到一个之前从未注意过的小问题,在这里记录一下
假设有一段代码是这样的:

if (0.4+0.3+0.2+0.1 == 1) {
    // do something...
}

你满心希望这个判断条件可以让你do something,但是……结果是你永远进不到这个if里面
这个就很恐怖了,于是你打算检查一下

 console.log(0.4+0.3+0.2+0.1)

好的,结果是0.9999999999999999

那么这是为什么呢!下面是揭秘环节!


我们知道,JS里所有数字,无论整型还是浮点,都是Number格式,即IEEE754标准里的64位二进制浮点数。
看到这里应该一些学过计组的同学就会大概明白原因了,这里再举一个通俗一点的例子
Q:十进制浮点小数是怎么转化为二进制的呢?
A:对十进制小数乘2得到的整数部分和小数部分,整数部分既是相应的二进制数码,再用2乘小数部分(之前乘后得到新的小数部分),又得到整数和小数部分。如此不断重复,直到小数部分为0或达到精度要求为止。
所以我们知道,十进制小数转成二进制时,除非十进制小数是1/2^n,那么,转化所得的二进制小数必然是一个近似的无限小数!
又因为64位的精度限制,导致这个近似的小数会被截断,造成精度上的损失,进而导致计算结果的偏差

那么,解决方案就很简单啦,只需要限定输出结果的精度就可以了~
Solution:

// Number.toPrecision()设定了浮点数精确到小数点后第几位
if (parseFloat((0.4+0.3+0.2+0.1).toPrecision(10)) == 1) {
    // do something...
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值