探索JDK

探索JDK之Double类

2018-10-31  本文已影响0人  苏小小北

1. 简介

Double类封装了一个值double原始类型的对象。此外,这个类提供了一些方法来转换double,String,以及其他处理double的常量和方法。
浮点类型的计算机表示形式与整数不同,建议先了解IEEE 754 浮点类型表示

2. 源码


(1) 实例变量:

同其他Number实现类,只有一个value
1.value:表示数值

    private final double value;
(2) 实例方法:

1.*value:byteValue、shortValue、intValue、longValue、floatValue、doubleValue

    public byte byteValue() {
        return (byte)value;
    }
    public short shortValue() {
        return (short)value;
    }
    public int intValue() {
        return (int)value;
    }
    public long longValue() {
        return (long)value;
    }
    public float floatValue() {
        return (float)value;
    }
    public double doubleValue() {
        return value;
    }

2.toString():调用FloatingDecimal返回double数值字符串,十进制形式

    public static String toString(double d) {
        return FloatingDecimal.toJavaFormatString(d);
    }

3.equals(Object):
调用doubleToLongBits转换为long类型进行比较

    public boolean equals(Object obj) {
        return (obj instanceof Double)
               //doubleToLongBits详解见下
               && (doubleToLongBits(((Double)obj).value) ==
                      doubleToLongBits(value));
    }

4.compareTo(Double):比较大小,-1,0,1
调用类方法compare,详解见下

    public int compareTo(Double anotherDouble) {
        return Double.compare(value, anotherDouble.value);
    }

4.NaN:判断是不是一个数字

NaNNot a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用。首次引入NaN的是1985年的IEEE 754浮点数标准。

    public boolean isNaN() {
        return isNaN(value);
    }
(3) 类变量:

1.MAX_VALUE:最大值
详见 IEEE 754 浮点类型表示

    // 1.7976931348623157e+308
    public static final double MAX_VALUE = 0x1.fffffffffffffP+1023;

2.MIN_NORMAL:最小正数
详见 IEEE 754 浮点类型表示

    // 2.2250738585072014E-308
    public static final double MIN_NORMAL = 0x1.0p-1022;

3.MIN_VALUE:最小值
详见 IEEE 754 浮点类型表示

    // 4.9e-324
    public static final double MIN_VALUE = 0x0.0000000000001P-1022; 

4.MAX_EXPONENT:最大指数,2^x中的x指数
详见 IEEE 754 浮点类型表示

    public static final int MAX_EXPONENT = 1023;

5.MIN_EXPONENT:最小指数,2^x中的x指数
详见 IEEE 754 浮点类型表示

    public static final int MIN_EXPONENT = -1022;

6.POSITIVE_INFINITY:正无穷

    public static final double POSITIVE_INFINITY = 1.0 / 0.0;

7.NEGATIVE_INFINITY:负无穷

    public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
(4) 类方法:

1.isNaN(double):判断是否是一个数字

NaN是唯一与自己不相等的值,NaN与任何值都不相等

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

2.isInfinite(double):判断是否无穷大

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

3.isFinite(double):判断是否有穷大

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

4.doubleToRawLongBits:原始方法,将double的二进制按整数类型来计算值,并返回long类型值。

    public static native long doubleToRawLongBits(double value);

5.doubleToLongBits(double):double类型占64位,跟long一样,这里是将double的64位表示原封不动的按整数类型来表示,正好跟long对应,所以说,一个double跟一个long对应,一个float跟一个int对应。
转换有很多好处,比较大小,可以通过对应的整数类型来比较。

    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;
    }

6.hashCode(double):哈希值,与Long处理方式一致

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

7.compare(double, double):比较两个double值,-1,0,1
先按二进制转为long值,然后计算大小,对应的long值和double相对大小还是一样,因为

    public static int compare(double d1, double d2) {
        if (d1 < d2)
            return -1;           // Neither val is NaN, thisVal is smaller
        if (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)
    }

8.longBitsToDouble:将long类型的二进制按double类型来计算

    public static native double longBitsToDouble(long bits);

9.其他方法:都是常规的方法了

    public static Double valueOf(String s) throws NumberFormatException {
        return new Double(parseDouble(s));
    }
    public static Double valueOf(double d) {
        return new Double(d);
    }
    public static double parseDouble(String s) throws NumberFormatException {
        return FloatingDecimal.parseDouble(s);
    }
    public static double sum(double a, double b) {
        return a + b;
    }
    public static double max(double a, double b) {
        return Math.max(a, b);
    }
    public static double min(double a, double b) {
        return Math.min(a, b);
    }
(5) 构造器:

1.Double(double):按值构造

    public Double(double value) {
        this.value = value;
    }

2.Double(String):按字符构造

    public Double(String s) throws NumberFormatException {
        value = parseDouble(s);
    }

后言


相比较整数类型,因为数值分布的不确定性,浮点类型没有缓存池机制。

其他


本人也是在慢慢学习中,如有错误还请原谅、敬请指出,谢谢!

上一篇下一篇

猜你喜欢

热点阅读