由一道题引起的思考?

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

java double long 取值_由一道题引起的思考? java中 long 和double都是64位。为什么double表示的范围大那么多呢?...相关推荐

  1. java 从set取值_怎样从java集合类set中取出数据?

    展开全部 创建set的copyiterator方法: Set set = new HashSet(); Iterator it = set.iterator(); while(it.hasNext() ...

  2. java map 随机取值_随机获取一个集合(List, Set)中的元素,随机获取一个Map中的key或value...

    利用Java提供的Random类.从List或Set中随机取出一个元素,从Map中随机获取一个key或value. 因为Set没有提供get(int index)方法,仅仅能先获取一个随机数后.利用一 ...

  3. java 联合查询取值_如何从SPARQL联合查询(Service关键字)返回特定变量?

    注意 - 您的远程查询必须实际在远程 endpoints 上执行,否则您将获得不同的错误 . PREFIX up: PREFIX taxon: PREFIX rdfs: PREFIX owl: SEL ...

  4. Java美元符号取值_如何在java中将带有美元符号的字符串数值转换为BigDecimal?

    BigDecimal Constructor采取有效的数字串. The String representation consists of an optional sign, '+' ('\u002B ...

  5. c#队列取值_在队列的开头获取对象– C#中的窥视操作

    要在队列的开始处获取对象,代码如下- 示例using System; using System.Collections.Generic; public class Demo { public stat ...

  6. java 整数 范围_探究JAVA整数的取值范围

    查看JAVA的Integer.MAX_VALUE和Integer.MIN_VALUE可知,在JAVA中,整数的取值范围是0x8000000到0x7FFFFFFF之间.JAVA Integer 网上很多 ...

  7. Java基本数据类型取值范围(float、double范围勘误)

    对于float和double的取值范围,网上很多有误的,其并不是按位直接计算. 基本类型 字节数 位数 最大值 最小值 byte 1 8 2^7 - 1 -2^7 short 2 16 2^15 - ...

  8. Java基本类型和取值范围

    Java基本类型 Java 虚拟机中的整型类型的取值范围如下: 一.  byte 类型:值为 8 位有符号二进制补码整数,默认值为零.对于 byte 类型,取值范围是从-128 至 127(-2^7 ...

  9. C++中int、long和double的取值范围和最大值,以及32位和64位的差异解读

    前言 一般对于C/C++下int等基本数字类型,主要关注三个维度,长度.取值范围和最大值的宏定义.下面分三个维度说明下. 有三个影响因素: 语言规则限制:比如int是变长,long是定长,double ...

最新文章

  1. JVM启动参数解析(转)
  2. TCP/IP详解--第二章
  3. 互斥体CMutex的使用
  4. jQuery练习:表单模态框
  5. Codeforces Global Round 12 D. Rating Compression 思维 + 贪心
  6. 不被重视的基础,高效地使用ADO.net连接对象
  7. 【注册机】Zillions of Games v2.0.1p 注册机
  8. CentOS7 Cloudera Manager6 完全离线安装 CDH6 集群
  9. 快餐店之间插入仓库,路最短,DP,POJ(1485)
  10. CMD发现一个得到字符串长度的方法
  11. 虚拟机centos6.5 --安装jdk
  12. 通力法评 | 简评中国证监会关于MOM产品的征求意见稿
  13. django使用mysql函数_请问django 可以操作mysql函数么?
  14. 我国会计界计算机软件界大规模研究,初级会计电算化第一章练习.doc
  15. 计算机专业教师技能比赛,青年教师展风采,技能比赛促提升
  16. google插件查看源码
  17. 【朋友圈点赞】测试场景(十一)
  18. 模拟二进制交叉算子详解
  19. 【POJ 3311】Hie with the Pie(状压DP)
  20. 碧蓝航线服务器维护到几点,碧蓝航线7月9号维护停服多长时间?科研第三期介绍[多图]...

热门文章

  1. ASICC码对照表整理
  2. Android 隐藏/透明小白条
  3. java开发实战小参考常见问题及处理
  4. 【MySQL练习】数据查询(02)-简易版
  5. 封禁恶意IP访问在我司实践总结
  6. 做短视频必须要知道的几个视频设置参数,爆款必备。
  7. 使用nexus搭建maven私服(一)安装启动
  8. 云计算平台项目团队组织架构与缘起
  9. 抓住金三银四的尾巴,解锁程序员面试《刷题神器》
  10. 吉大计算机专业有名的导师,2019吉林大学计算机科学与技术学院导师简介:申铉京...