JDK源码(9)-Double、Float
一、概述
这个千篇一律,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相关推荐
- 从JDK源码看关闭钩子
关闭钩子 Java提供了Shutdown Hook机制,它让我们在程序正常退出或者发生异常时能有机会做一些清场工作.使用的方法也很简单,Java.Runtime.addShutdownHook(Thr ...
- 从JDK源码角度看Long
概况 Java的Long类主要的作用就是对基本类型long进行封装,提供了一些处理long类型的方法,比如long到String类型的转换方法或String类型到long类型的转换方法,当然也包含与其 ...
- JDK源码学习-基础
JDK源码学习 目录 基础 1. 安装 1.1 下载JDK 1.2 配置环境变量 1.3 验证 2. 简单的程序 2.1 编写代码 2.2 编译文件 2.3 执行类 3. java基本类型 基础 1. ...
- 【JDK】JDK源码分析-HashMap(1)
概述 HashMap 是 Java 开发中最常用的容器类之一,也是面试的常客.它其实就是前文「数据结构与算法笔记(二)」中「散列表」的实现,处理散列冲突用的是"链表法",并且在 J ...
- jdk源码分析书籍 pdf_如何阅读源码?
点击上方"IT牧场",选择"设为星标" 技术干货每日送达! 阅读源码是每个优秀开发工程师的必经之路,那么这篇文章就来讲解下为什么要阅读源码以及如何阅读源码. 首 ...
- JDK源码学习路线~每天学一点~每天进步一点点
很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起.以下为小编整理的通常所需阅读的源码范围. 标题为包名,后面序号为优先级1-4,优先级递减 1.java.lang 1) Objec ...
- JDK源码笔记-java.util.HashMap
2019独角兽企业重金招聘Python工程师标准>>> HashMap 的存储实现 当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片段为例: Java代 ...
- JDK源码(1)-阅读指引
说在最前面的话: 其实JDK源码的阅读,网上资料特别多,我阅读的最主要目的是自己学习,所以我读的可能不那么好,我的角度是从源码和源码对应的注释读起,顺便还能练练英语. 接下来准备对JDK的常见源码进行 ...
- 从JDK源码角度看Short
概况 Java的Short类主要的作用就是对基本类型short进行封装,提供了一些处理short类型的方法,比如short到String类型的转换方法或String类型到short类型的转换方法,当然 ...
- JAVA JDK源码在线阅读
Java的版本是1.8.0_111,我把JDK源码发布到了github上,大家看起来也比较方便,地址: https://github.com/daiqingliang/java_jdk1.8.0_11 ...
最新文章
- 2015_8_21作业——有自翻译有复制他人的英语太差
- oracle存档模式,Oracle开启归档模式并设置RMAN自动备份策略
- 人类倾向于高估人工智能的进步,低估自身智能的复杂性-读《AI 3.0》
- Error writing file '/tmp/...' (Errcode: 28)
- 01_基于应用拆分的技术架构
- 有这些好习惯,可以让你悄悄变优秀
- 方舟非主机服务器无限距离,方舟非专业服务器距离限制怎么解除 | 手游网游页游攻略大全...
- Java序列化机制原理,java面试题,java基础笔试题,BAT
- 第一个案例实操——WordCount
- Ubuntu解压各种文件命令
- python SMTP发送带图片的邮件时,报TypeError: Could not guess image MIME subtype错误的解决办法
- Python模拟简易版淘宝客服机器人
- 转一篇千与千寻的影评。。。
- Python四种读取数据文件的方法
- WPS 如何删除我的设备
- App Store 审核指南 2017-12-11
- linux带source地址ping,实战经验:Linux Source NAT在Ping场景下的应用
- 使用代理抓取反爬微信文章
- mysql数据库中针对结果保留小数的问题
- Android记账系统可行性分析,毕业设计论文-基于安卓的大学生记账管理系统的设计与实现.doc...