[八]基础数据类型之Double详解

Double 基本数据类型double  的包装类

Double 类型的对象包含一个 double 类型的字段

属性简介

用来以二进制补码形式表示 double 值的比特位数

public static final int SIZE = 64;

二进制补码形式表示 double 值的字节数

public static final int BYTES = SIZE / Byte.SIZE;

表示基本类型 double 的 Class 实例

public static final Class<Double>   TYPE = (Class<Double>) Class.getPrimitiveClass("double");

能够表示的最大值只有标准化一种形式,也就是前文提到过的

public static final double MAX_VALUE = 0x1.fffffffffffffP+1023;

标准化的最小值

public static final double MIN_NORMAL = 0x1.0p-1022;

最小值还有非标准化的形式

public static final double MIN_VALUE = 0x0.0000000000001P-1022;

正无穷等同于Double.longBitsToDouble(0x7ff0000000000000L)

public static final double POSITIVE_INFINITY = 1.0 / 0.0;

负无穷等同于Double.longBitsToDouble(0xfff0000000000000L).

public static final double NEGATIVE_INFINITY = -1.0 / 0.0

NaNnot a number等同于Double.longBitsToDouble(0x7ff8000000000000L)

public static final double NaN = 0.0d / 0.0

指数真值的有效的最大值

public static final int MAX_EXPONENT = 1023

指数真值的有效的最小值

public static final int MIN_EXPONENT = -1022

这些属性,看过浮点数简介的话,可以很清晰的理解,再次说明下,但凡本人的系列文章,全部都是有顺序的

构造方法

Double 依然提供了根据基本类型double以及double的String形式构造

String形式依然借助于parseXXX形式 parseDouble

Double(double value)

Double(String s)

常用方法

对于浮点数,有一些额外的属性方法

我们浮点数介绍中,对于浮点数的表示形式进行了介绍

Double提供了对于指定值的表示形式的获取方法, 这表示形式也就是是一个64位的二进制位序列

Double 获取表示形式对于获取表示形式 提供了两种形式的方法,主要是针对于非数字的NaN的不同表示他们可以与longBitsToDouble 可以进行互相转换 doubleToRawLongBits(double) 根据 IEEE 754 浮点“双精度格式”位布局,返回指定浮点值的表示形式,并保留 NaN 值 如果参数是正无穷大,则结果为 0x7ff0000000000000L 如果参数是负无穷大,则结果为 0xfff0000000000000L 如果参数是 NaN,则结果是表示实际 NaN 值的 long 整数   与 doubleToLongBits 方法不同 doubleToRawLongBits 并没有将 NaN 编码为一个“规范的”NaN 值   在所有情况下,结果都是一个 long 整数 将其赋予 longBitsToDouble(long) 方法将生成一个与 doubleToRawLongBits 的参数相同的浮点值     本地方法 doubleToLongBits(double) 根据 IEEE 754 浮点双精度格式 ("double format") 位布局,返回指定浮点值的表示形式   如果参数是正无穷大,则结果为 0x7ff0000000000000L 如果参数是负无穷大,则结果为 0xfff0000000000000L 如果参数是 NaN,则结果为 0x7ff8000000000000L   在所有情况下,结果都是一个 long 整数 将其赋予 longBitsToDouble(long) 方法将生成一个与 doubleToLongBits 的参数相同的浮点值 (所有 NaN 值被压缩成一个“规范”NaN 值时除外)   也就是NaN的处理不一样,此方法将NaN全部规范化为指定固定的值   依赖  doubleToRawLongBits

doubleToRawLongBits(double)

根据 IEEE 754 浮点“双精度格式”位布局,返回指定浮点值的表示形式,并保留 NaN 值 如果参数是正无穷大,则结果为 0x7ff0000000000000L 如果参数是负无穷大,则结果为 0xfff0000000000000L 如果参数是 NaN,则结果是表示实际 NaN 值的 long 整数   与 doubleToLongBits 方法不同 doubleToRawLongBits 并没有将 NaN 编码为一个“规范的”NaN 值   在所有情况下,结果都是一个 long 整数 将其赋予 longBitsToDouble(long) 方法将生成一个与 doubleToRawLongBits 的参数相同的浮点值     本地方法

doubleToLongBits(double)

根据 IEEE 754 浮点双精度格式 ("double format") 位布局,返回指定浮点值的表示形式   如果参数是正无穷大,则结果为 0x7ff0000000000000L 如果参数是负无穷大,则结果为 0xfff0000000000000L 如果参数是 NaN,则结果为 0x7ff8000000000000L   在所有情况下,结果都是一个 long 整数 将其赋予 longBitsToDouble(long) 方法将生成一个与 doubleToLongBits 的参数相同的浮点值 (所有 NaN 值被压缩成一个“规范”NaN 值时除外)   也就是NaN的处理不一样,此方法将NaN全部规范化为指定固定的值   依赖  doubleToRawLongBits

doubleToRawLongBits(double)

根据 IEEE 754 浮点“双精度格式”位布局,返回指定浮点值的表示形式,并保留 NaN 值 如果参数是正无穷大,则结果为 0x7ff0000000000000L 如果参数是负无穷大,则结果为 0xfff0000000000000L 如果参数是 NaN,则结果是表示实际 NaN 值的 long 整数   与 doubleToLongBits 方法不同 doubleToRawLongBits 并没有将 NaN 编码为一个“规范的”NaN 值   在所有情况下,结果都是一个 long 整数 将其赋予 longBitsToDouble(long) 方法将生成一个与 doubleToRawLongBits 的参数相同的浮点值     本地方法

doubleToLongBits(double)

根据 IEEE 754 浮点双精度格式 ("double format") 位布局,返回指定浮点值的表示形式   如果参数是正无穷大,则结果为 0x7ff0000000000000L 如果参数是负无穷大,则结果为 0xfff0000000000000L 如果参数是 NaN,则结果为 0x7ff8000000000000L   在所有情况下,结果都是一个 long 整数 将其赋予 longBitsToDouble(long) 方法将生成一个与 doubleToLongBits 的参数相同的浮点值 (所有 NaN 值被压缩成一个“规范”NaN 值时除外)   也就是NaN的处理不一样,此方法将NaN全部规范化为指定固定的值   依赖  doubleToRawLongBits

longBitsToDouble(long)返回对应于给定位表示形式的 double 值 如果参数是 0x7ff0000000000000L,则结果为正无穷大 如果参数是 0xfff0000000000000L,则结果为负无穷大 如果参数值在 0x7ff0000000000001L 到 0x7fffffffffffffffL 之间或者在 0xfff0000000000001L 到 0xffffffffffffffffL 之间,则结果为 NaN

浮点数有几种特殊的表示,比如 无穷 NaN等

额外的,也提供了一些相关的方法

static boolean isNaN(double v)

静态方法是否一个非数字 (NaN) 值非数值 true

static boolean isFinite(double d)

静态方法是否是有限的浮点数有限的true

static boolean isInfinite(double v)

静态方法是否是无穷大是无穷大  true

boolean isInfinite()

实例方法依赖静态方法

boolean isNaN()

实例方法 依赖静态方法

比较

static int compare(double d1, double d2)

静态方法比较两个doubled1 < d2 小于0d1 = d2 等于0 d1 > d2 大于0

int compareTo(Double anotherDouble)

实例方法两个对象进行大小比较,依赖于静态方法

parseXXX系列

字符串解析 为 基本类型,

不需要对象,所以都是静态方法

返回一个字符串形式表示的基本类型double表现效果同valueOf(String),不过valueOf 返回的是对象

如果不包含可以解析的字符串将会抛出异常

底层依赖sun.misc.FloatingDecimal

valueOf系列

把基本基本类型 包装为对象

用来创建获得对象,所以无需对象,全都是静态方法

不同于之前介绍的整数 数值,他们都有缓冲

Double v不存在缓存,valueOf也是直接new 对象

static Double valueOf(double d)

static Double valueOf(String s)

依赖parseDouble方法所以上面说跟valueOf(String)表现效果相同,本身就是一样

Double没有 decode方法

XXXValue系列

类似之前介绍的其他数值类型全部都是强转内部的  valuereturn (XXX)value;

byteValue() shortValue() intValue() longValue() floatValue() doubleValue()

toString  toXXXString  系列

toString(double)

toString()

toHexString(double)

static String toString(double d)

静态方法

String toString()

实例方法内部调用  static String toString(double d)

static String toHexString(double d)

静态方法返回 double参数的十六进制字符串表示形式API帮助文档中对于字符的转换有明确的规定,可以仔细研究下示例

toString系列好像没什么好说的,又好像有很多要说的

用到的时候对于格式字符的规定有疑惑直接查看API

equals

boolean equals(Object obj)

将此对象与指定对象比较 当且仅当参数不是 null 而是 Double 对象,且表示的 Double 值与此对象表示的 double 值相同时,结果为 true 为此,当且仅当将方法 doubleToLongBits(double) 应用于两个值所返回的 long 值相同时,才认为这两个 double 值相同 注意,在大多数情况下,对于 Double 类的两个实例 d1 和 d2,当且仅当    d1.doubleValue() == d2.doubleValue() 为 true 时,d1.equals(d2) 的值才为 true   但是,有以下两种例外情况:   如果 d1 和 d2 都表示 Double.NaN,那么即使 Double.NaN==Double.NaN 值为 false,equals 方法也将返回 true 如果 d1 表示 +0.0 而 d2 表示 -0.0,或者相反,那么即使 +0.0==-0.0 值为 true,equals 测试也将返回 false 此定义使得哈希表得以正确操作

hashCode

static int hashCode(double value)

静态方法获得一个value的hashcode值

int hashCode()

实例方法依赖静态方法

其他方法

sum(double, double)

max(double, double)

min(double, double)

总结

其实浮点数的表示形式与使用规范才是重点

就像Float似的, Double只是double的包装,double也只是IEEE754 标准的一个实现,根本还是在于标准的理解

Double  和 Float 提供的方法结构基本上是一样的,毕竟都是浮点数,标准也都是IEEE754 

至此,已经介绍了,基本类型包装类中的数值部分

也就是Byte  Short  Integer Long Float Double   他们作为数值有很多类似的方法

这些类似的方法属性也可以说是作为数值类型的共性

个人认为,找到共性能够更好理解运用 java提供的类与功能

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏nnngu

算法01 七大排序之:冒泡排序和快速排序

排序是我们生活中经常会面对的问题。同学们做操时会按照从矮到高排列;老师查看上课出勤情况时,会按学生学号顺序点名;高考录取时,会按成绩总分降序依次录取等。排序是数...

3697
来自专栏chenjx85的技术专栏

leetcode-8-字符串转整数 (atoi)

在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数...

892
来自专栏7号代码

十进制数字用A~Z表示成二十六进制(剑指Offer附加题及扩展)

思路: 这道题实际上考察的是把二十六进制表示成十进制数字,将输入的字符串先转换成字符数组,遍历数组中的每一个字符,用这个字符减去A再加1就是该位对应的十进制数...

631
来自专栏令仔很忙

新手学JAVA(六)----处理随机性的数据

在我们的日常生活中会遇到很多随机性的事情,比如:摇奖,彩票,掷色子,这些都可以通过程序计算其中奖的概率。在JAVA的类库中,有一个专门操作这种随机性数据的类—-...

1092
来自专栏mathor

JAVA——基本数据类型

1284
来自专栏Jack的Android之旅

疯狂java笔记之常用的内部排序

在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快速查找相关记录。

671
来自专栏塔奇克马敲代码

第3章 字符串、向量和数组

1916
来自专栏逆向技术

计算机基础知识_进制转化

          进制转化 一.任何一个进制转化为10进制的方式 156的十进制可以看做1*10^2 + 5*10^1  +   6*10^0 首先我们看一下...

2250
来自专栏韦弦的偶尔分享

Swift 字符串转整数 (atoi) - LeetCode

1、在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为...

1113
来自专栏强仔仔

Java基础知识-基本数据类型相互转型

这是我第一次系统性的总结java这门语言的基础知识用法,因本人经验有限,所以在总结的过程中如果有错误或者有歧义等等之类的问题,都可以联系我QQ:20801753...

1968

扫码关注云+社区

领取腾讯云代金券