0.1+0.2≠0.3?

96 阅读5分钟

如果用一句话概况,就是精度丢失

如果还要弄清楚0.1+2等于多少⬇⬇⬇⬇

前置知识

要知道,计算机中,所有数据都是以二进制形式存在的

1、什么是二进制?

  • 是用0和1两个数码来表示的数
  • 逢二进一
1.1、计算机采用二进制的原因
  • 技术实现简单:计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示
  • 简化运算规则:两个二进制数和、积运算组合各有三种,运算规则简单,有利于简化计算机内部结构,提高运算速度。
  • 适合逻辑运算:逻辑代数是逻辑运算的理论依据,二进制只有两个数码,正好与逻辑代数中的“真”和“假”相吻合。

2、进制转换

2.1、十进制整数转二进制

方法:“除2取余,逆序排列”,直到商小于1为止

  • 例1: 255=(11111111)B

  • 例2:789=(1100010101)B

快速计算十进制转二进制的方式

blog.csdn.net/u013804636/…

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

参考文档

mp.weixin.qq.com/s?__biz=MzA…

www.bilibili.com/video/BV1RE…