概述
由一道题引起的思考?
java中 long 和double都是64位。为什么double表示的范围大那么多呢?
百度标准答案是这样子的:
double是n*2^m(n乘以2的m次方)这种形式存储的,只需要记录n和m两个数就行了,m的值影响范围大,所以表示的范围比long大。
但是m越大,n的精度就越小,所以double并不能把它所表示的范围里的所有数都能精确表示出来,而long就可以。
但是我看了半天都没理解啥意思,然后查了一些资料。个人整理如下:
贴上一些整数类型的范围:
1.整型 (一个字节占8位)
类型 存储需求 bit数 取值范围 备注
int 4字节 4*8 (32)-2^31~2^31-1
short 2字节 2*8 (16) -2^15~2^15-1
long 8字节 8*8 (64)-2^63~2^63-1
byte 1字节 1*8 (8) -2^7~2^7-1= -128~127
2.浮点型
类型 存储需求 bit数 取值范围 备注
float 4字节 4*8 (32) 3.4028235E38~= 3.4*10^38
double 8字节 8*8 (64) 1.7976931348623157E308 ~=1.7*10^308
从范围来看double和long完全不是一个级别的了吧?long最大为=2^63-1,而double为2^1024。。。差太远了
但是,double怎么有这么大的范围呢?
首先浮点类型分单精度float和双精度double
而他们的底层存储结构不同:他们是由符号位,指数位,尾数位组成。
1.符号位:最高位31,表示浮点数的正负,0为正,1为负;
2.指数位:占的位数代表着改类型的范围,例如float指数位范围第30-23位(占8bit),则范围为2^8-1等同于-128~128
计算方式同float,double的指数范围:第62-52位(占11bit),范围:2^11-1等同于-1024~1024
3.尾数位:占的位数代表着精度,也就是小数点后面的尾数。 float的尾数:23位,其范围为:0~2^23,而2^23=8388608=106.92,
所以float的精度为6~7位,能保证6位为绝对精确,7位一般也是正确的,8位就不一定了(但不是说8位就绝对不对了)
计算方式同float,double的尾数:52位,2^52=2.220446049250313E-16,最小是16位,但最小不是1.0E-16,所以精度是15~16,能保证15,一般16位。
种类-------符号位-------------指数位----------------尾数位----
float---第31位(占1bit)---第30-23位(占8bit)----第22-0位(占23bit)
double--第63位(占1bit)---第62-52位(占11bit)---第51-0位(占52bit)
float:
1bit(符号位)
8bits(指数位)
23bits(尾数位)
double:
1bit(符号位)
11bits(指数位)
52bits(尾数位)
java中可以直接输出该最大值:
import java.util.*;
public class test3 {
public static void main(String[] args) {
System.out.println("long:"+Long.MAX_VALUE);
System.out.println("float:"+Float.MAX_VALUE);
System.out.println("double:"+Double.MAX_VALUE);
}
}
结果:
long:9223372036854775807
float:3.4028235E38
double:1.7976931348623157E308
本文由 SAn 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2017/06/20 15:21
最后
以上就是迷你吐司为你收集整理的java 8个字节共64位_由一道题引起的思考? java中 long 和double都是64位。为什么double表示的范围大那么多呢?...的全部内容,希望文章能够帮你解决java 8个字节共64位_由一道题引起的思考? java中 long 和double都是64位。为什么double表示的范围大那么多呢?...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复