如果用一句话概况,就是精度丢失
如果还要弄清楚0.1+2等于多少⬇⬇⬇⬇
前置知识
要知道,计算机中,所有数据都是以二进制形式存在的
1、什么是二进制?
- 是用0和1两个数码来表示的数
- 逢二进一
1.1、计算机采用二进制的原因
- 技术实现简单:计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示
- 简化运算规则:两个二进制数和、积运算组合各有三种,运算规则简单,有利于简化计算机内部结构,提高运算速度。
- 适合逻辑运算:逻辑代数是逻辑运算的理论依据,二进制只有两个数码,正好与逻辑代数中的“真”和“假”相吻合。
2、进制转换
2.1、十进制整数转二进制
方法:“除2取余,逆序排列”,直到商小于1为止
- 例1: 255=(11111111)B
- 例2:789=(1100010101)B
快速计算十进制转二进制的方式
2.2、十进制小数转二进制
方法:“乘2取整,正序排列”,直到积中的小数部分为零
- 例:0.125=(0.001)B
- 例: 105.625=(1101001.101)B
2.3、二进制转十进制
方法:位权展开求和,(指数:整数部分从右开始为0,小数部分从左开始为-1
- 例1:
100101110
=12^8+02^7+02^6+12^5+02^4+12^3+12^2+12^1+0*2^0
=302
- 例2:
0.001
= 02^-1+02^-2+1*2^-3
=0.125
3、二进制的指数形式
任何一个十进制都能表示成科学计数法的方式:D=M* (1≤|M|<10 ),
同理,二进制也可以 B=M* ( E为指数,M为B的尾数,1≤|M|<10 )
- 十进制105=1.05*
- 二进制0.00101=1.01* (这里的11是二进制,代表3)
3.1、为什么要用指数表示方式
计算机的存储空间有限,可以在有限的存储空间表示更大的数据范围
4、浮点数的IEEE 754标准
浮点数(小数),有可能是无限不循环小数,或者无限循环小数,那超过计算机存储上限的话,就要采取一定的规则去舍弃——IEEE 754(0舍1入)。
- 64位:浮点数分为单精度对应32位操作系统和双精度对应64位操作系统。目前的操作系统大多是64位操作系统
- 符号位:0负数,1正数
为什么0.1+0.2≠0.3
5.1、将 0.1 0.2 转换成二进制
- 0.1 转换成二进制是:
0.000 1100 1100 1100 1100 1100 1100 1100 ……
- 0.2 转换成二进制是:
0.00 1100 1100 1100 1100 1100 1100 1100 ……
它们都是无限循环小数
5.2、将二进制转换成指数形式
- 0.1
一般形式:0.000 1100 1100 1100 1100 1100 1100 1100 ……
指数形式:1.100 1100 1100 1100 1100 1100 1100 1100 …… 指数为-4
- 0.2
一般形式:0.00 1100 1100 1100 1100 1100 1100 1100 ……
指数形式:1.100 1100 1100 1100 1100 1100 1100 …… 指数为-3
5.3、将指数形式转换成IEEE 754标准
- 0.1
指数形式:1.100 1100 ……省略10个1100…… 1100 1100... 指数为-4
IEEE 754:1.100 1100 ……省略10个1100…… 1101 0 指数为-4
(红色处是第52位,之后的0舍1入)
- 0.2
指数形式:1.100 1100 ……省略10个1100…… 1100 1100... 指数为-3
IEEE 754:1.100 1100 ……省略10个1100…… 1101 0 指数为-3
(红色处是第52位,之后的0舍1入)
5.4、浮点数相加
调整成指数位一致再相加,对0.1进行移位
1.100 1100 ……省略10个1100…… 1101 0
0.1100 1100 ……省略10个1100…… 1101 0
0.1100 1100 ……省略10个1100…… 1101 指数为-3
然后再相加
0.1100110011001100110011001100110011001100110011001101 指数为-3
- 1.1001100110011001100110011001100110011001100110011010 指数为-3
10.0110011001100110011001100110011001100110011001100111 指数为-3
0.0100110011001100110011001100110011001100110011001100111 指数为0
5.5、结果转换成十进制
Math.pow(2,-2)+Math.pow(2,-5)+Math.pow(2,-6)+Math.pow(2,-9)+Math.pow(2,-10)+Math.pow(2,-13)+Math.pow(2,-14)+Math.pow(2,-17)+Math.pow(2,-18)+Math.pow(2,-21)+Math.pow(2,-22)+Math.pow(2,-25)+Math.pow(2,-26)+Math.pow(2,-29)+Math.pow(2,-30)+Math.pow(2,-33)+Math.pow(2,-34)+Math.pow(2,-37)+Math.pow(2,-38)+Math.pow(2,-41)+Math.pow(2,-42)+Math.pow(2,-45)+Math.pow(2,-46)+Math.pow(2,-49)+Math.pow(2,-50)+Math.pow(2,-53)+Math.pow(2,-54)+Math.pow(2,-55)
结果等于
0.30000000000000004
6、0.1+0.1为什么等于0.2?
0.1100110011001100110011001100110011001100110011001101 指数为3
- 0.1100110011001100110011001100110011001100110011001101 指数为3
1.1001100110011001100110011001100110011001100110011010 指数为3
0.0011001100110011001100110011001100110011001100110011010 指数为0
Math.pow(2,-3)+Math.pow(2,-4)+Math.pow(2,-7)+Math.pow(2,-8)+Math.pow(2,-11)+Math.pow(2,-12)+Math.pow(2,-15)+Math.pow(2,-16)+Math.pow(2,-19)+Math.pow(2,-20)+Math.pow(2,-23)+Math.pow(2,-24)+Math.pow(2,-27)+Math.pow(2,-28)+Math.pow(2,-31)+Math.pow(2,-32)+Math.pow(2,-35)+Math.pow(2,-36)+Math.pow(2,-39)+Math.pow(2,-40)+Math.pow(2,-43)+Math.pow(2,-44)+Math.pow(2,-47)+Math.pow(2,-48)+Math.pow(2,-51)+Math.pow(2,-52)+Math.pow(2,-54)
结果为:0.2