由一道题引起的思考? java中 long 和double都是64位。为什么double表示的范围大那么多呢?

由一道题引起的思考?
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

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值