0.1+0.2

根据 ECMAScript 标准,JavaScript 中只有一种数字类型:基于 IEEE 754 标准的双精度 64 位二进制格式的值(-(253 -1) 到 253 -1)。它并没有为整数给出一种特定的类型。除了能够表示浮点数外,还有一些带符号的值:+Infinity-Infinity  NaN (非数值,Not-a-Number)。

要检查值是否大于或小于 +/-Infinity,你可以使用常量Number.MAX_VALUENumber.MIN_VALUE

IEEE 754双精度是64位的二进制数

1位是数符s s=1表示负数 s=0表示正数
2-12位为阶码E (E-1023-1023至1023之间)

Math.pow(2,1023)

8.98846567431158e+307

Math.pow(2,1024)

Infinity

13-64位为尾数M (1+M在1至2之间,省略首位1)

V=(-1)^s*(1+M)*2^(E-1023)

计算0.1的内存结构

0.1=1.6*2^-4

正数s=0

E=-4+1023=1019=01111111011

M=0.6

小数转二进制小数位乘以2取整数位

0.6*2=1.2  1

0.2*2=0.4  0

0.4*2=0.8  0

0.8*2=1.6  1

0.6*2=1.2  1

0.2*2=0.4  0

0.4*2=0.8  0

0.8*2=1.6  1

1001循环

由于只有52位

1001100110011001100110011001100110011001100110011001

对最后一位进行舍入

四种舍入方向:向最接近的可表示的值;当有两个最接近的可表示的值时首选“偶数”值;向负无穷大(向下);向正无穷大(向上)以及向0(截断)。 

1001100110011001100110011001100110011001100110011010

内存表示方式

0 01111111011 1001100110011001100110011001100110011001100110011010

转二进制小数值

尾数加一1.1001100110011001100110011001100110011001100110011001

小数点左移4位

 

0.0001100110011001100110011001100110011001100110011001101

 

0.1.toString(2)

//0.0001100110011001100110011001100110011001100110011001101

 

0.2转

0.2=1.6*2^-3

s=0

E=-3+1023=1020=01111111100

M=0.6

0 01111111100 1001100110011001100110011001100110011001100110011010

1.100110011001100110011001100110011001100110011001101小数点左移3位

0.001100110011001100110011001100110011001100110011001101

 

0.2.toString(2)

//0.001100110011001100110011001100110011001100110011001101

 

相加并舍入

0.0001100110011001100110011001100110011001100110011001101+

0.001100110011001100110011001100110011001100110011001101=

0.0100110011001100110011001100110011001100110011001101

转十进制0.30000000000000004

0.30000000000000004.toString(2)

//0.0100110011001100110011001100110011001100110011001101


虚像:

评论 阅读