java变量表示范围及精度问题

2021.01.15 08:01 21
阅读约 5 分钟

各类型变量的表示范围

先来个总结看一下各类型的表示范围

类型储存需求取值范围
Byte 1byte-27 ~ 27-1
Short 2byte-215 ~ 215-1
Integer4byte-231 ~ -231-1
Long8byte-263 ~ 263-1
Double8byte2-1024 ~ 21024-1
Float4byte2-149 ~ 2128-1

Float

Double和Float的表示方法与其它四种不太一样,让我先来了解下面这个公式V=(-1)s*M*2E

符号位(S):1bit指数位(E):8bit尾数位(M):23bit
  1. 符号位(S):最高位(31位)为符号位,表示整个浮点数的正负,0为正,1为负;
  2. 指数位(E):23-30位共8位为指数位,这里指数的底数规定为2(取值范围:0~255)。这一部分的最终结果格式为: 2E−127,即范围 -127~128。另外,标准中,还规定了,当指数位8位全0或全1的时候,浮点数为非正规形式(这个时候尾数不一样了),所以指数位真正范围为:-126~127
  3. 尾数位(M):0-22位共23位为尾数位,表示小数部分的尾数,即形式为1.M或0.M,至于什么时候是1,什么时候是0,则由指数和尾数共同决定。 小数部分最高有效位是1的数被称为正规(规格化)形式。小数部分最高有效位是0的数被称为非正规(非规格化)形式,其他情况是特殊值。

取值范围

最终Float的取值范围可以通过下柿换算:

(1)S*(2E127)*(1.M)

符号

指数部分

指数部分-127

尾数部分

小数部分的最高有效位

形式

1

255

128

非0

没有

NaN

1

255

128

0

没有

负无穷

1

1~254

-126~127

任意

1

正规形式(负数)

1

0

-127

非0

0

非正规形式(负数)

1

0

-127

0

没有

负0

0

0

-127

0

没有

正0

0

0

-127

非0

0

非正规形式(正数)

0

1~254

-126~127

任意

1

正规形式(正数)

0

255

128

0

没有

正无穷

0

255

128

非0

没有

NaN

精度丢失

举个例子我们就看一下3.75的内存结构到底是什么样子的。首先转化成二进制形式11.11。

3=>11 
0.75*2=1.5=> 1
0.5*2=1=>1 

转化成二进制指数形式1.111*21。由此我们可以得知尾数部分是111(将1省略掉了),不足23位的后边补0,指数部分是1+127=128,对应二进制10000000。所以存储结构就是01000000011100000000000000000000

可以看到实际上只有23位来表示精度,与Integer的32位相比,精度在转换过程中会出现丢失。

Double

符号位(S):1bit指数位(E):11bit尾数位(M):52bit

  double这里就类似float,只是double的长度更大,所以范围就更大,但规则是一样的。double的值:(1)S(2E1023)(1.M)

同样的情况,long转double精度也会丢失。

 

 

字数:1187 发布于 1 个月前
Copyright 2018-2021 Siques