0.1+0.2 != 0.3 ? WHY ???

面试中经常问道0.1+0.2 != 0.3的原因

小数的二进制表示

相信很多人都能轻而易举的算出一个正整数的二进制表示,但是都没有考虑过小数怎么表示。JS中数值使用的为64位表示,这其中1位表示的是符号位(正数还是负数),52位表示小数,还有剩余的11位表示整数。
对于整数大家应该都知道是对2取余,去求一个数的二进制,比如 9 这个正整数

		   余数
	9/2 --> 1
	4/2-->  0    
	2/2 --> 0 
	1 
	从下往上一次得出 9的二进制为 1001 

整数的正负 由最高位决定 最高位为0 为正数,最高位是1,为负数 。
那么对于小数呢 ,正好和整数相反,整数是对2取余,而小数是对2求积。比如0.1这个小数

			小于1 为0, 大于1 为 1 ,对其结果 -1后继续 *2 ,直到等于1为止
	0.1*2 --> 0
	0.2*2 --> 0
	0.4*2 --> 0
	0.8*2 --> 1 (1.6-1)
	0.6*2 --> 1 (1.2-1)
	0.2*2 --> 0
	0.4*2 --> 0
	0.8*2-->  1
	........

由此我们得知了0.1是一个循环的 0.0001100110011001100110011001100110011001100110011001101
同理我们可以根据以上方法求得 0.2的二进制表示
0.001100110011001100110011001100110011001100110011001101
根据二进制求和得出结果为 0.0100110011001100110011001100110011001100110011001101
转为十进制 则等于0.30000000000000004 != 0.3 所以当前的等式不成立。

到这儿我觉着你应该搞清了吧

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值