JavaScript的浮点数计算问题

在JavaScript中执行 0.1 + 0.2 == 0.3,结果为false,为什么呢?


之前总认为浮点数运算是因为位数不够,所以不能精确,但0.1和0.2明显位数不多呀?

浮点数 123.11 用浮点表示就是 1.2311*10^2,即1.2311向坐移动两位

那么0.1 不就可以表示成1*10^(-1)么,基数是1,偏移量是-1,只要用二进制的浮点数的基数和偏移量分别表示出来不就可以精确的表示了么,为什么计算还是有误差呢?


哈哈,有没有发现错误呀??

错误点在1*10^(-1),这些偏移量是十进制中的偏移,相当于乘以进制10,那么二进制中的偏移就要乘以2(或者除以2)

所以二进制的 1,向左偏移一位就是除以2,实际上是十进制的0.5(1/2),再偏移一位就是0.25(1/4),继续偏移是0.125(1/8),

那有没有一个二进制的数,偏移后刚好等于0.1呢?

这就相当于问有没有一个整数,被2^n除了之后刚好得0.1


反过来来算一下,

n = 1,原数是0.1

n = 2,原数是0.4

n = 3,原数是0.8

n = 4,原数是1.6

n = 5,原数是3.2

n = 6,原数是4.8

没有一个是整数,所以不存在一个二进制浮点数,能够精确的表示0.1

这并不是JavaScript的问题,所有采用二进制的浮点数都存在相同问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值