【Java】JDK源码分析——Double

// 表示double实际上可以表示的最小非零正数:4.9e-324

// 小数点前为0x0

// 它的值和Double.longBitsToDouble(0x1L)计算的结果相同

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



// double可以表示的最大指数

public static final int MAX_EXPONENT = 1023;



// double可以表示的最小指数

public static final int MIN_EXPONENT = -1022;



// double占的位数

public static final int SIZE = 64;



// 一个double数值占的字节数

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



// 抑制没有类型检查而出现的警告

@SuppressWarnings("unchecked")

// Double类中对应的原始的double

// Double.class和double.class不相等,但Double.TYPE和double.class相等

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



// 用于存储double的数值

private final double value;



// 用于序列化

private static final long serialVersionUID = -9172774392245257468L;



[]( )2.构造方法

------------------------------------------------------------------------



### []( )1)参数为double



**Double.java中的相关代码:**



public Double(double value) {

	// 保存到全局变量

    this.value = value;

}



### []( )2)参数为String



**Double.java中的相关代码:**



public Double(String s) throws NumberFormatException {

	// 调用parseDouble方法,将字符串解析成double型数值

    value = parseDouble(s);

}



[]( )3\. parseDouble方法

-----------------------------------------------------------------------------------



将字符串解析成double型数值。  

**Double.java中的相关代码:**



public static double parseDouble(String s) throws NumberFormatException {

	// 调用FloatingDecimal的parseDouble方法

    return FloatingDecimal.parseDouble(s);

}



[]( )4\. valueOf方法

-------------------------------------------------------------------------------



### []( )1)参数为double



将double型数值转换为Double对象。  

**Double.java中的相关代码:**



public static Double valueOf(double d) {

	// 创建Double对象,对double数值进行封装,返回

    return new Double(d);

}



### []( )2)参数为String



将String对象转换为Double对象。  

**Double.java中的相关代码:**



public static Double valueOf(String s) throws NumberFormatException {

	// 调用parseDouble方法,将字符串解析成double型数值

	// 创建Double对象,对double数值进行封装,返回

    return new Double(parseDouble(s));

}



[]( )5\. isNaN方法

-----------------------------------------------------------------------------



判断当前的数是不是数值型的数。  

**Double.java中的相关代码:**



public boolean isNaN() {

	// 调用了重载方法

    return isNaN(value);

}



调用重载的isNaN方法。  

判断double型的数是不是数值型的数。  

**Double.java中的相关代码:**



public static boolean isNaN(double v) {

	// 每个NaN的存储地址不同

    return (v != v);

}



[]( )6\. isInfinite方法

----------------------------------------------------------------------------------



判断当前的数是不是无穷大。  

**Double.java中的相关代码:**



public boolean isInfinite() {

	// 调用了重载方法

    return isInfinite(value);

}



调用了重载的isInfinite方法。  

判断double型的数是不是无穷大。  

**Double.java中的相关代码:**



public static boolean isInfinite(double v) {

	// 判断是否为正无穷或负无穷

    return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);

}



[]( )7\. isFinite方法

--------------------------------------------------------------------------------



判断一个double型的数是否有限。  

**Double.java中的相关代码:**



public static boolean isFinite(double d) {

	// 对double数取绝对值,判断是否小于等于double能表示的最大值

    return Math.abs(d) <= DoubleConsts.MAX_VALUE;

}



[]( )8\. doubleToLongBits方法

----------------------------------------------------------------------------------------



将double型的数转换成满足IEEE 754浮点型表示法的long型的数。



**符号位MASK:0x8000000000000000L  

指数位MASK:0x7ff0000000000000L  

有效位MASK:0x000fffffffffffffL  

正无穷:0x7ff0000000000000L  

负无穷:0xfff0000000000000L  

NaN:0x7ff8000000000000L**



**Double.java中的相关代码:**



public static long doubleToLongBits(double value) {

	// 调用doubleToRawLongBits转换成long型的数

	// 详解在1)处

    long result = doubleToRawLongBits(value);

    // 根据指数位和非零有效位判断是不是NaN

    if ( ((result & DoubleConsts.EXP_BIT_MASK) ==

          DoubleConsts.EXP_BIT_MASK) &&

         (result & DoubleConsts.SIGNIF_BIT_MASK) != 0L)

        // 若是,则设置为NaN

        result = 0x7ff8000000000000L;

    // 返回

    return result;

}



### []( )1)doubleToRawLongBits方法



**Double.java中的相关代码:**



public static native long doubleToRawLongBits(double value);



该方法是一个native方法,该方法会将一个double型的数转换成满足IEEE 754浮点型表示法的long型的数,即使该数为NaN,也会进行转换。



[]( )9\. longBitsToDouble方法

----------------------------------------------------------------------------------------



将long型的数按照IEEE 754浮点数标准转换为double型的数。  

**Double.java中的相关代码:**



public static native double longBitsToDouble(long bits);



该方法是一个native方法。



[]( )10\. toString方法

---------------------------------------------------------------------------------



将Double对象转换为String对象。  

**Double.java中的相关代码:**



public String toString() {

	// 调用了重载方法

    return toString(value);

}



调用了重载的toString方法。  

**Double.java中的相关代码:**



public static String toString(double d) {

	// 调用FloatingDecimal的toJavaFormatString方法

    return FloatingDecimal.toJavaFormatString(d);

}



[]( )11\. toHexString方法

------------------------------------------------------------------------------------



将double型的数转换为十六进制的String对象。  

**Double.java中的相关代码:**



public static String toHexString(double d) {

    // 若该数不是有限的,即超过了double型的最大值或者为NaN

    if (!isFinite(d) )

        // 调用toString方法进行转换

        return Double.toString(d);

    else { // 若该数有限

        // 用来保存转换的十六进制的字符串

        StringBuilder answer = new StringBuilder(24);



        // 若为负数

        if (Math.copySign(1.0, d) == -1.0)

            // 拼接一个负号

            answer.append("-");

        // 拼接16进制的标识符

        answer.append("0x");

        // 求绝对值

        d = Math.abs(d);

        

        // 若数值为0

        if(d == 0.0) {

            // 则拼接“0.0p0”,即0乘以2的0次方,为0

            answer.append("0.0p0");

        } else { // 若不为零

            // 判断数值是否超过了正常的最小正数

            boolean subnormal = (d < DoubleConsts.MIN_NORMAL);



            // 调用doubleToLongBits方法

			// 将其转换成满足IEEE 754浮点型标准的long型数

			// 进行与运算,64到52位变为0

			// 提取51到0位,即有效位(尾数部分)

			// 最后进行或运算,最高位,即64位,置为1

            long signifBits = (Double.doubleToLongBits(d)

                               & DoubleConsts.SIGNIF_BIT_MASK) |

                0x1000000000000000L;



            // 若数值小于正常的最小正数

            // 则拼接”0.”,即0x0.

            // 否则,拼接”1.”,即0x1.

            answer.append(subnormal ? "0." : "1.");



            // 调用Long的toHexString方法

			// 将有效位转换为16进制表示的字符串,截取从第三位到第十六位

            // 64位二进制转换位十六进制为16位(0到15)

            // 十六位中,前三位(0,1,2)表示符号位和指数部分

			// 有效位从第四位(3)开始

            String signif = Long.toHexString(signifBits).substring(3,16);

            // 若有效位都是0,则直接拼接一个”0”

            // 若不全为0,则进行正则表达式匹配

            // 从后向前,去掉最少一个最多12个的”0”

            answer.append(signif.equals("0000000000000") ?

                          "0":

                          signif.replaceFirst("0{1,12}$", ""));



            // 拼接p,表示指数中以2为底数

            answer.append('p');

            // 若数值小于正常的最小正数

			// 则指数部分拼接最小指数

			// 否则,调用Math的getExponent方法获取指数,再拼接

            answer.append(subnormal ?

                          DoubleConsts.MIN_EXPONENT:

                          Math.getExponent(d));

        }

        // 获取字符串,返回

        return answer.toString();

    }

}



[]( )12\. byteValue方法

----------------------------------------------------------------------------------



获取当前数值对应的byte型数。  

**Double.java中的相关代码:**



public byte byteValue() {

    // 进行类型转换,返回

    return (byte)value;

}



[]( )13\. shortValue方法

-----------------------------------------------------------------------------------



获取当前数值对应的short型数。  

**Double.java中的相关代码:**



public short shortValue() {

    // 进行类型转换,返回

    return (short)value;

}



[]( )14\. intValue方法

---------------------------------------------------------------------------------



获取当前数值对应的int型数。  

**Double.java中的相关代码:**



public int intValue() {

 	// 进行类型转换,返回

    return (int)value;

}



[]( )15\. longValue方法

----------------------------------------------------------------------------------



获取当前数值对应的long型数。  

**Double.java中的相关代码:**



public long longValue() {

	// 进行类型转换,返回

    return (long)value;

}



[]( )16\. floatValue方法

-----------------------------------------------------------------------------------



获取当前数值对应的float型数。  

**Double.java中的相关代码:**



public float floatValue() {

	// 进行类型转换,返回

    return (float)value;

}



[]( )17\. doubleValue方法

------------------------------------------------------------------------------------



获取当前数值对应的double型数。  

**Double.java中的相关代码:**



public double doubleValue() {

	// 直接返回

    return value;

}



[]( )18\. hashCode方法

---------------------------------------------------------------------------------



获取Double对象的哈希值。  

**Double.java中的相关代码:**



@Override

public int hashCode() {

    // 调用Double的静态方法

    return Double.hashCode(value);

}



### []( )1)hashCode方法



**Double.java中的相关代码:**



public static int hashCode(double value) {

   // 将value转换成满足IEEE 754浮点型标准的long型数

    long bits = doubleToLongBits(value);

    // 将其不带符号右移32位,再和原数进行异或运算

    // 最后进行类型转换,返回

    return (int)(bits ^ (bits >>> 32));

}



[]( )19\. equals方法

-------------------------------------------------------------------------------



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值