0.1 + 0.2 === 0.3 // false

十进制转换为二进制

 1.整数转二进制: 采用"除2取余,逆序排列"法:

 2.小数转二进制:采用"乘2取整,顺序排列"法:

 

二进制转换为十进制

二进制转为十进制要从右到左用二进制的每个数去乘以2的相应次方,小数点后则是从左往右。如果首位是0就表示正整数,如果首位是1则表示负整数,正整数可以直接换算,负整数则需要先取反再换算。

  • 如要想二进制00101010转为十进制,因为以0开头,所以这是正整数,计算如下所示:
(0 * 2的零次方) + (1* 2的一次方)+ (0 * 2 的二次方)+(1 * 2的三次方) +(0 * 2的四次方) +(1* 2的五次方) + (0 * 2的六次方) + (0 * 2的7次方) = 0 + 2 + 0 + 8 + 0 + 32 + 0 + 0 = 42
  • 如果11101011想转为*负的十进制,因为最高位是1,所以先减一取反 00010101,然后计算出00010101对应的十进制为21,所以11101011最终对应的十进制为 -21。

javascript如何表示数字

JavaScript使用Number类型表示数字(整数和浮点数),遵循 IEEE 754 标准 通过64位来表示一个数字通过图片具体看一下数字在内存中的表示

运算详情

计算机无法直接对十进制的数字进行运算,这是硬件物理特性已经决定的。这样运算就分成了两个部分:先按照IEEE 754转成相应的二进制,然后对阶运算

1、原本 0.1 和 0.2 的二进制表示

0.1 = 1.1001100110011001100110011001100110011001100110011010 * 2^-4
0.2 = 1.1001100110011001100110011001100110011001100110011010 * 2^-3


2、可以看到,0.1 的阶码为 -4,0.2 的阶码为 -3,依照小阶对大阶的原则,我们需要将 0.1 的阶码变为 -3,因此其尾数部分需要右移一位。对阶之后 0.1 的存储为:

0.1 = 0.11001100110011001100110011001100110011001100110011010 * 2^-3

0.2 = 1.1001100110011001100110011001100110011001100110011010 * 2^-3

3、对阶之后 0.1 的尾数溢出一位,正好是0,我们舍弃掉,所以最终的计算前的存储为

// 0.1
0  01111111100  1100110011001100110011001100110011001100110011001101 
// 0.2
0  01111111100  1001100110011001100110011001100110011001100110011010

4、两个二进制进行加法计算

    0  01111111100   1100110011001100110011001100110011001100110011001101
+  0  01111111100   1001100110011001100110011001100110011001100110011010
--------------------------------------------------------------------------------------------------------------
=  0  01111111100  10110011001100110011001100110011001100110011001100111


5、结果中尾数部分已经发生了进位,超过了52位,因此阶码部分加1(乘以2),即阶码由原来的 -3 变为 -2,所以阶码部分为 01111111101。而尾数部分右移一位(除以2),进行舍入(最后一位是1因此最低位进位),得到最终的存储:

// 这一步就是造成 JS 中 0.1 + 0.2 !== 0.3 的原因
0 0111111101 1011001100110011001100110011001100110011001100110100

6、将最终结果转换为十进制数为

2^-2 + (1+(1*2^-1 + 0 * 2^-2+1*2^-3+1*2^-4+... )
=     0.3000000000000000444089209850062616169452667236328125
 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值