如何将Javascript号存储在内存中

SKi*_*ng7 1 javascript numbers

首先,我们看到以下代码:

result = 0.1 + 0.2;     
alert(result===0.3);// false
result=100.1+100.2;
alert(result===200.3);//true
Run Code Online (Sandbox Code Playgroud)

我相信0.1100.1(100 + 0.1)类似地存储在内存中,因为小数.1位于它们两者中.

那么,为什么加法的结果不同?

Pau*_*aul 6

它们在内存中的存储方式不同:http://steve.hollasch.net/cgindex/coding/ieeefloat.html

0.1二进制:

0.1*2 = 0 + 0.2
0.2*2 = 0 + 0.4
0.4*2 = 0 + 0.8
0.8*2 = 1 + 0.6
0.6*2 = 1 + 0.2
0.2*2 = 0 + 0.4
0.4*2 = 0 + 0.8
0.8*2 = 1 + 0.6
0.6*2 = 1 + 0.2

正如你所看到的,后0.2重复整个模式(0011)只会不停地重复,所以0.10.0001100110011001100110011...永远重复

为了表示在23位尾数中,我们必须将其向左移动,直到我们在小数点之前有一个1(在将位移到4位并移除小数点前的1之后100110011...)然后在第23位进行舍入,并且我们得到:10011001100110011001101.

由于我们移动了4个位置,我们的指数是127-4(127是32位偏差).在8位二进制的123中01111011,剩下的就是符号位,我们知道它是0,因为0.1是正数.所以32位二进制数的每个组成部分是:

sign:0
exponent:01111011
尾数:10011001100110011001101

0.1表示为00111101110011001100110011001101浮点数.

转换回来我们必须将其拆分,然后将指数转换回十进制整数(123).我们将尾数(假设前面的1)移到右边(127 - 123 = 4)次并获得:0.00011001100110011001101101然后我们将其转换回十进制:

0*1/2 + 0*1/4 + 0*1/8 + 1/16 + 1/32 + 0*1/64 + 0*1/128 + 1/256 + 1/512 + 
0 + 1/4096 + 1/8192 + 0 + 1/65536 + 1/131072 + 0 + 1/1048576 + 1/2097152 + 
0 + 1/16777216 + 1/33554432 + 0 + 1/134217728
Run Code Online (Sandbox Code Playgroud)

如果你做数学会给你一些接近0.100000001的东西,而不是0.1.那是因为我们在第23位进行了舍入.0.1不能以二进制形式存储,因为它会永远重复,所以在第23位之后我们就会出现不准确的情况.当您对数字进行算术运算时,这些不准确性会被执行,并且错误可能会变得更大.

如果你用100.1做同样的事情,你会得到:

1100100.0001100110011001100 ...永远重复:

向右移6次,将小数点前的1移至23位:10010000011001100110011

指数为127 + 6 = 133(1000 0101)

标志再次为0,所以你有:

01000010110010000011001100110011
Run Code Online (Sandbox Code Playgroud)