Java--float/double取值范围与精度
来源:互联网 发布:自助发稿平台 源码 编辑:程序博客网 时间:2024/05/16 12:23
Java浮点数
浮点数结构
要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个东西,必须采用某种方法,比如,简单点的,float四个字节,前两个字节表示整数位,后两个字节表示小数位(这就是一种规则标准),这样就组成一个浮点数。而Java中浮点数采用的是IEEE 754标准。
IEEE 754
这里就不细说什么是IEEE 754了,就直接讲具体内容,有兴趣的可以自己百度。
float
符号位(S):1bit指数位(E):8bit尾数位(M):23bit一个float4字节32位,分为三部分:符号位,指数位,尾数位。
(1).符号位(S):最高位(31位)为符号位,表示整个浮点数的正负,0为正,1为负;
(2).指数位(E):23-30位共8位为指数位,这里指数的底数规定为2(取值范围:0~255)。这一部分的最终结果格式为:
(3).尾数位(M):0-22位共23位为尾数位,表示小数部分的尾数,即形式为1.M或0.M,至于什么时候是1,什么时候是0,则由指数和尾数共同决定。 小数部分最高有效位是1的数被称为正规(规格化)形式。小数部分最高有效位是0的数被称为非正规(非规格化)形式,其他情况是特殊值。 最终float的值 =
符号
指数
部分
指数部分-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
double
符号位(S):1bit指数位(E):11bit尾数位(M):52bit
double这里就类似float,只是double的长度更大,所以范围就更大,但规则是一样的。double的值 =
取值范围
根据表1可知,float的取值范围:
负无穷 ——
1). 上面的“——”表示中间不能取值,例如负无穷到
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2). -149的得来:看上面理论应该是150(指数全0,则指数值 = 0 -127,这个时候尾数取最小,
- 1
- 2
- 1
- 2
double的取值同float:
负无穷 ——
1074 =| (-1022) - (52)|
另外,注意表格中,还有NaN,即表示非数值,例如:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
浮点数精度
精度是由尾数决定的,为什么?由浮点数的值计算公式可知:当指数的最终值为负,虽然这个时候浮点数的值能表示更小,但这个时候仅仅能表示0~1(或-1~0)这个数段的小数,没有实际意义。所以精度主要是看尾数的值。
float
float的尾数:23位,其范围为:0~
- 1
- 2
- 1
- 2
不理解的话,可以再这样想:23位,二进制0101……0101,尾数表示小数位,最小为0000……0001(22个0,最后一个1),即
double
计算方式同float,double的尾数:52位,
更多关于Java浮点数的,可以参考这里:基础野:细说浮点数(肥子John)
原文链接点击打开链接
- Java中float/double取值范围与精度
- Java--float/double取值范围与精度
- float double精度和取值范围
- java数值范围以及float与double精度丢失问题
- float与double的范围和精度
- float与double的范围和精度
- float与double的范围和精度
- float与double的范围和精度
- float与double的范围和精度
- float与double的范围和精度
- float与double的范围和精度
- float与double的范围和精度
- float与double的范围和精度
- float与double的范围和精度
- float与double的范围和精度
- float与double的范围和精度
- float与double的范围和精度
- float与double的范围和精度
- TQ335x的uboot移植(一)
- 同步调用和异步调用
- Latex 通过生成dvi文件 生成pdf文件
- Spring 使用注解方式进行事务管理
- 线性代数、微积分学习与回顾
- Java--float/double取值范围与精度
- js正则表达式 必须包含数字、字母、特殊字符
- Unity框架——消息事件
- cwvision图像识别
- 写blog
- 使用Realm进行数据操作(一)
- MVPVM模式介绍
- 年鉴2015
- Video4Linux框架简介(5) - V4L2框架和v4l2_subdev