概述
Double类在对象中包装了原始类型double的值。 类型为Double的对象包含一个类型为double的字段。此外,此类还提供了几种将 double转换为String和将String转换为double的方法,以及在处理double时有用的其他常量和方法。
继承关系
public final class Double extends Number implements Comparable
继承自 Number 实现了 Comparable 接口
成员属性
public static final double POSITIVE_INFINITY = 1.0 / 0.0;
定义正无穷大
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
定义负无穷大
public static final double NaN = 0.0d / 0.0;
保存double类型的非数字
public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308
double类型的最大正有限值的常量
public static final double MIN_NORMAL = 0x1.0p-1022; // 2.2250738585072014E-308
定义double能表示的最小值(二进制最高位是1)
public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324
定义double能保持的正数最小值,(二进制最高位不限制)
public static final int MAX_EXPONENT = 1023;
double能表示的数的最大指数。
public static final int MIN_EXPONENT = -1022;
double能表示的数的最小指数。
public static final int SIZE = 64;
一个double类型的数据需要的存储空间 64位
public static final int BYTES = SIZE / Byte.SIZE;
一个double类型的数据需要的存储空间 8比特
public static final Class TYPE = (Class) Class.getPrimitiveClass("double");
返回Double类型对应的基本数据类型名称,也就是"double"
构造器
public Double(double value) {
this.value = value;
}
public Double(String s) throws NumberFormatException {
value = parseDouble(s);
}
关键方法
+ toHexString()
转化为16进制
public static String toHexString(double d) { ... }
+ valueOf()
返回对应的Double值
public static Double valueOf(double d) {
return new Double(d);
}
##### + valueOf()
转化为Double
public static Double valueOf(String s) throws NumberFormatException { return new Double(parseDouble(s)); }
##### + parseDouble()
Stirng转化为double
public static double parseDouble(String s) throws NumberFormatException { return FloatingDecimal.parseDouble(s); }
##### + isNaN()
判断非数字
public static boolean isNaN(double v) { return (v != v); }
##### + isInfinite()
判断是否正负无穷大
public static boolean isInfinite(double v) { return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY); }
##### + isFinite()
判断是否有限
public static boolean isFinite(double d) { return Math.abs(d) <= DoubleConsts.MAX_VALUE; }
##### + byteValue()
转化为byte类型,
public byte byteValue() { return (byte)value; }
除此之外还有其他类似方法:
shortValue(),intValue(),longValue(),floatValue(),doubleValue()
##### + equals()
类型相同,并且值相同,才会返回true
public boolean equals(Object obj) { return (obj instanceof Double) && (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value)); }
##### + doubleToLongBits()
按照字节位,以long的形式读出来。
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; }
##### + compareTo()
和另一个Double值进行比较。
实际上是两个double,按照long读取出来,进行比较。其相对大小是相同的,但是按照long读取出来会计算更快。
public int compareTo(Double anotherDouble) { return Double.compare(value, anotherDouble.value); }
##### + compare()
两个double进行比较
public static int compare(double d1, double d2) { ... }
##### + sum()
求和
public static double sum(double a, double b) { return a + b; }
##### + min()
求最小值
public static double min(double a, double b) { return Math.min(a, b); }
##### + max()
求最大值
public static double max(double a, double b) { return Math.max(a, b); }
#### 实现原理
##### compare()是如何比较的?
最有意思的一点是,在比较两个double的大小的时候,是按照字节位,以long的形式读取出来的。java基本数据类型的长度如下:
| 类型 | 位(bit)|大小(字节/Byte) |
| ------- |---| ---------- |
| byte | 8 | 1 |
| short | 16 | 2 |
| char | 16 | 2 |
| int | 32 | 4 |
| float | 32 | 4 |
| long | 64 | 8 |
| double | 64 | 8 |
因为long和double的存储位数是一样的,double按照long读取出来进行比较,和double直接比较,结果是一致的。
#### 希望和大家多多交流
---
我16年毕业以后,做的是前端,目前打算深入学习java开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。