0.1+0.2 ≠ 0.3

JS中整数和浮点数统属于数字类型,在计算机中,所有的数字都是采用IEEE754标准的64位双精度浮点数形式存储,进而导致了无论是储存、计算中都会存在精度问题。其存储形式为:

  1. 第一位是正负符号位,0: 正数 1: 负数
  2. 第二至十二这十个为指数位,表示次方数
  3. 剩余52位为尾数,储存小数部分,超出的部分自动进一舍零
    既然位数是固定的,那么必然会处在截断,进而导致精度问题。
    0.1和0.2在计算机中存储形式为:

那么两者相加
0.0100 1100 1100 1100
转为十进制:0 * 1/2 + 1 * 1/4 + 0 * 1/8 + 0 * 1/16 + 1 * 1/32 + 0 * 1/64 …
最终得到为0.30000000000000004
同样的道理,不仅小数部分,乃至整数也会存在精度问题,因为整数也是数字,数字也是按照浮点数存储,正数的最大最小值为:
最大:+ 2的53次方 -1 ➡️ +9007199254740991
最小:- 2的53次方 -1 ➡️ -9007199254740991
所以就导致了

以上是计算时的精度问题,那么接下来看下储存时的精度问题

从上可知,toFixed时候其实是进行四舍五入,但是由于2.55在计算中存储为2.549999999…,2.45存储为2.4500000…,所以就导致了2.55.toFixed(1)➡️2.5、2.45.toFixed(1)➡️2.5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值