一、概述

这个千篇一律,Double是对基本数据类型double的包装,里面包含了double类型的字段。这个类也提供了一些将String和double转换为Double的方法,还有一些处理double的方法。

作者是:

 * @author  Lee Boynton* @author  Arthur van Hoff* @author  Joseph D. Darcy* @since JDK1.0

二、属性

提供了很多属性值,如下:

正无穷:POSITIVE_INFINITY:Double.longBitsToDouble(0x7ff0000000000000L)

负无穷:NEGATIVE_INFINITY:Double.longBitsToDouble(0xfff0000000000000L)

非数字:Not-a-Number (NaN):Double.longBitsToDouble(0x7ff8000000000000L)

最大值:MAX_VALUE:Double.longBitsToDouble(0x7fefffffffffffffL)

单精度最小值:MIN_NORMAL:Double.longBitsToDouble(0x0010000000000000L)

双精度最小值:MIN_VALUE:Double.longBitsToDouble(0x1L)

最大指数:MAX_EXPONENT:1023

最小指数:MIN_EXPONENT:-1022

三、主要方法

toString:很简单

toHexString:将double转换为16进制字符串,就是StringBuilder的字符串拼接:

    public static String toHexString(double d) {if (!isFinite(d) )//如果是NaN或是无穷,直接返回对应的字符串形式return Double.toString(d);else {//初始化最大长度:24StringBuilder answer = new StringBuilder(24);if (Math.copySign(1.0, d) == -1.0)    // value is negative,answer.append("-");                  // so append sign infoanswer.append("0x");d = Math.abs(d);if(d == 0.0) {answer.append("0.0p0");} else {boolean subnormal = (d < DoubleConsts.MIN_NORMAL);// Isolate significand bits and OR in a high-order bit// so that the string representation has a known// length.long signifBits = (Double.doubleToLongBits(d)& DoubleConsts.SIGNIF_BIT_MASK) |0x1000000000000000L;// Subnormal values have a 0 implicit bit; normal// values have a 1 implicit bit.answer.append(subnormal ? "0." : "1.");// Isolate the low-order 13 digits of the hex// representation.  If all the digits are zero,// replace with a single 0; otherwise, remove all// trailing zeros.String signif = Long.toHexString(signifBits).substring(3,16);answer.append(signif.equals("0000000000000") ? // 13 zeros"0":signif.replaceFirst("0{1,12}$", ""));answer.append('p');// If the value is subnormal, use the E_min exponent// value for double; otherwise, extract and report d's// exponent (the representation of a subnormal uses// E_min -1).answer.append(subnormal ?DoubleConsts.MIN_EXPONENT:Math.getExponent(d));}return answer.toString();}}

判断是否为NaN

    public static boolean isNaN(double v) {return (v != v);}

判断是否无限

    public static boolean isInfinite(double v) {return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);}

判断是否有限

    public static boolean isFinite(double d) {return Math.abs(d) <= DoubleConsts.MAX_VALUE;}

haseCode被重写了

    public static int hashCode(double value) {long bits = doubleToLongBits(value);return (int)(bits ^ (bits >>> 32));}

doubleToLongBits:很多方法中用到了这个方法,理解为将double转换为64位的long即可

  • 根据IEEE 754浮点“双格式”位布局返回指定浮点值的表示。
  • 位63(由掩码0x8000000000000000L选择的位)表示浮点数的符号。 位62-52(由掩码0x7ff0000000000000L选择的位)表示指数。 位51-0(由掩码0x000fffffffffffffL选择的位)表示浮点数的有效数(有时称为尾数)。
  • 如果参数为无穷大,则结果为0x7ff0000000000000L 。
  • 如果参数为负无穷大,则结果为0xfff0000000000000L 。
  • 如果参数是NaN,结果是0x7ff8000000000000L 。
  • 在所有情况下,结果是long整数,当给予longBitsToDouble(long)方法时,将产生与doubleToLongBits的参数相同的浮点值(除了所有NaN值都被折叠为单个“规范”NaN值)。
    public static long doubleToLongBits(double value) {long result = doubleToRawLongBits(value);// Check for NaN based on values of bit fields, maximum// exponent and nonzero significand.if ( ((result & DoubleConsts.EXP_BIT_MASK) ==DoubleConsts.EXP_BIT_MASK) &&(result & DoubleConsts.SIGNIF_BIT_MASK) != 0L)result = 0x7ff8000000000000L;return result;}

doubleToRawLongBits:与doubleToLongBits方法不同, doubleToRawLongBits不会将编码NaN的所有位模式折叠到单个“规范”NaN值。是一个native的方法了。

public static native long doubleToRawLongBits(double value);

compare:重写比较,注意Double.NaN返回是0

    public static int compare(double d1, double d2) {if (d1 < d2)return -1;           // Neither val is NaN, thisVal is smallerif (d1 > d2)return 1;            // Neither val is NaN, thisVal is larger// Cannot use doubleToRawLongBits because of possibility of NaNs.long thisBits    = Double.doubleToLongBits(d1);long anotherBits = Double.doubleToLongBits(d2);return (thisBits == anotherBits ?  0 : // Values are equal(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)1));                          // (0.0, -0.0) or (NaN, !NaN)}

还有三个运算方法

sum,max,min

三、Float

Float与Double非常类似,不再单独讲解

JDK源码(9)-Double、Float相关推荐

  1. 从JDK源码看关闭钩子

    关闭钩子 Java提供了Shutdown Hook机制,它让我们在程序正常退出或者发生异常时能有机会做一些清场工作.使用的方法也很简单,Java.Runtime.addShutdownHook(Thr ...

  2. 从JDK源码角度看Long

    概况 Java的Long类主要的作用就是对基本类型long进行封装,提供了一些处理long类型的方法,比如long到String类型的转换方法或String类型到long类型的转换方法,当然也包含与其 ...

  3. JDK源码学习-基础

    JDK源码学习 目录 基础 1. 安装 1.1 下载JDK 1.2 配置环境变量 1.3 验证 2. 简单的程序 2.1 编写代码 2.2 编译文件 2.3 执行类 3. java基本类型 基础 1. ...

  4. 【JDK】JDK源码分析-HashMap(1)

    概述 HashMap 是 Java 开发中最常用的容器类之一,也是面试的常客.它其实就是前文「数据结构与算法笔记(二)」中「散列表」的实现,处理散列冲突用的是"链表法",并且在 J ...

  5. jdk源码分析书籍 pdf_如何阅读源码?

    点击上方"IT牧场",选择"设为星标" 技术干货每日送达! 阅读源码是每个优秀开发工程师的必经之路,那么这篇文章就来讲解下为什么要阅读源码以及如何阅读源码. 首 ...

  6. JDK源码学习路线~每天学一点~每天进步一点点

    很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起.以下为小编整理的通常所需阅读的源码范围. 标题为包名,后面序号为优先级1-4,优先级递减 1.java.lang 1) Objec ...

  7. JDK源码笔记-java.util.HashMap

    2019独角兽企业重金招聘Python工程师标准>>> HashMap 的存储实现 当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片段为例: Java代 ...

  8. JDK源码(1)-阅读指引

    说在最前面的话: 其实JDK源码的阅读,网上资料特别多,我阅读的最主要目的是自己学习,所以我读的可能不那么好,我的角度是从源码和源码对应的注释读起,顺便还能练练英语. 接下来准备对JDK的常见源码进行 ...

  9. 从JDK源码角度看Short

    概况 Java的Short类主要的作用就是对基本类型short进行封装,提供了一些处理short类型的方法,比如short到String类型的转换方法或String类型到short类型的转换方法,当然 ...

  10. JAVA JDK源码在线阅读

    Java的版本是1.8.0_111,我把JDK源码发布到了github上,大家看起来也比较方便,地址: https://github.com/daiqingliang/java_jdk1.8.0_11 ...

最新文章

  1. 2015_8_21作业——有自翻译有复制他人的英语太差
  2. oracle存档模式,Oracle开启归档模式并设置RMAN自动备份策略
  3. 人类倾向于高估人工智能的进步,低估自身智能的复杂性-读《AI 3.0》
  4. Error writing file '/tmp/...' (Errcode: 28)
  5. 01_基于应用拆分的技术架构
  6. 有这些好习惯,可以让你悄悄变优秀
  7. 方舟非主机服务器无限距离,方舟非专业服务器距离限制怎么解除 | 手游网游页游攻略大全...
  8. Java序列化机制原理,java面试题,java基础笔试题,BAT
  9. 第一个案例实操——WordCount
  10. Ubuntu解压各种文件命令
  11. python SMTP发送带图片的邮件时,报TypeError: Could not guess image MIME subtype错误的解决办法
  12. Python模拟简易版淘宝客服机器人
  13. 转一篇千与千寻的影评。。。
  14. Python四种读取数据文件的方法
  15. WPS 如何删除我的设备
  16. App Store 审核指南 2017-12-11
  17. linux带source地址ping,实战经验:Linux Source NAT在Ping场景下的应用
  18. 使用代理抓取反爬微信文章
  19. mysql数据库中针对结果保留小数的问题
  20. Android记账系统可行性分析,毕业设计论文-基于安卓的大学生记账管理系统的设计与实现.doc...

热门文章

  1. hadoop面试题答案
  2. DHCP服务器在企业里的各种应用方案
  3. 虚拟CentOS访问Windows下共享文件(二)
  4. ORM内核原理解析之:延迟加载
  5. DiskGenius的 “终止位置参数溢出”错误解决方法。
  6. Google BBR拥塞控制算法模型初探
  7. ios 旋转加载gif_iOS 中gif图的显示
  8. netty 常见疑问 faq
  9. Dubbo的SPI机制对比传统的SPI做了哪些改进?Dubbo的IOC和AOP
  10. 计算机工程与应用 网站,计算机工程与应用杂志