Double類是原始類型double的包裝類,它包含若干有效處理double值的方法,如將其轉換為字符串表示形式,反之亦然。Double類的對象可以包含一個double值。
Double
類包裝原始類型的值 double
中的對象。類型的對象 Double
包含一個類型為的字段 double
。
此外,這個類提供了轉換的幾種方法 double
到String
和 String
一個double
帶有打交道時,以及其他常量和方法有用 double
。
一、類定義
public final class Double extends Number implements Comparable<Double> {}
- 類被聲明為final的,表示不能被繼承;
- 繼承了Number抽象類,可以用于數字類型的一系列轉換;
- 實現了Comparable接口,強行對實現它的每個類的對象進行整體排序
二、成員變量
//一個保持正無窮大的 double 類型常數public static final double POSITIVE_INFINITY = 1.0 / 0.0;//一個保持負無窮大的 double 類型常數public static final double NEGATIVE_INFINITY = -1.0 / 0.0;//值為NaN(Not a Number,非數)的一個 double 類型常數public static final double NaN = 0.0d / 0.0;//一個double類型常量存儲double的有限最大值public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308//一個double類型常量存儲double的有限的最小正數public static final double MIN_NORMAL = 0x1.0p-1022; // 2.2250738585072014E-308//保持最小雙精度類型的最小非零的常數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類型變量為64位,即8個字節。public static final int SIZE = 64;//用于表示雙精度值(double值)的字節數public static final int BYTES = SIZE / Byte.SIZE;//該類的實例表示基本類型double。@SuppressWarnings("unchecked")public static final Class<Double> TYPE = (Class<Double>) Class.getPrimitiveClass("double");
三、構造器
//構造一個新分配的Double對象,該對象表示原始double參數。
public Double(double value) {this.value = value;}
//構造一個新分配的Double對象,該對象表示double 字符串表示的類型的浮點值。
public Double(String s) throws NumberFormatException {value = parseDouble(s);}
四、常用方法
-
toString():
返回對應于double值的字符串。
public String toString(double d){return FloatingDecimal.toJavaFormatString(d);}public String toString() {return toString(value);}
-
valueOf():
返回使用提供的值初始化的Double對象。
public static Double valueOf(String s) throws NumberFormatException {return new Double(parseDouble(s));}public static Double valueOf(double d) {return new Double(d);}
-
parseDouble():
通過解析字符串返回double值。與valueOf()不同,因為它返回一個原始double值,valueOf()返回Double對象。
public static double parseDouble(String s) throws NumberFormatException {return FloatingDecimal.parseDouble(s);}
-
byteValue():
public byte byteValue(){ return (byte)value;}
-
shortValue():
返回與此雙重對象相對應的短值。
public short shortValue(){ return (short)value;}
-
intValue():
返回與此雙重對象相對應的int值。
public int intValue(){ return (int)value;}
-
longValue():
返回與此雙重對象相對應的長整型值。
public long longValue(){ return (long)value;}
-
doubleValue():
返回與此雙重對象相對應的double值。
public double doubleValue(){ return value;}
-
floatValue():
返回與此雙重對象相對應的浮點值。
public float floatValue() {return (float)value;}
-
hashCode():
返回對應于這個Double對象的哈希碼。
public int hashCode() {return Double.hashCode(value);}
-
isNaN():
如果所考慮的雙對象不是數字,則返回true,否則返回false。
public boolean isNaN() {return isNaN(value);}
如果我們不需要創建任何雙重對象,則可以使用另一種靜態方法是NaN(double val)。它提供了與上述版本類似的功能。
public static boolean isNaN(double val) {return (v != v);}
-
toHexString():
返回參數double值的十六進制表示形式。
public static String toHexString(double d) {/** Modeled after the "a" conversion specifier in C99, section* 7.19.6.1; however, the output of this method is more* tightly specified.*/if (!isFinite(d) )// For infinity and NaN, use the decimal output.return Double.toString(d);else {// Initialized to maximum size of output.StringBuilder 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();}}
-
equals():
用于比較兩個Double對象的相等性。如果兩個對象都包含相同的double值,則此方法返回true。只有在檢查平等的情況下才能使用。在其他所有情況下,compareTo方法應該是首選。
public boolean equals(Object obj) {return (obj instanceof Double)&& (doubleToLongBits(((Double)obj).value) ==doubleToLongBits(value));}
-
compareTo():
用于比較兩個Double對象的數值相等性。這應該用于比較兩個Double值的數值相等性,因為它會區分較小值和較大值。返回小于0,0的值,大于0的值小于,等于和大于。
public int compareTo(Double anotherDouble) {return Double.compare(value, anotherDouble.value);}
-
compare():
用于比較兩個原始double值的數值相等。因為它是一個靜態方法,因此可以在不創建任何Double對象的情況下使用它。
public int compareTo(Double anotherDouble) {return Double.compare(value, anotherDouble.value);}
五、總結
- 方法中大量使用了重載
- 多數方法都是用到了IEEE 754碼
- IEEE 754碼:
由于不同機器所選用的基數、尾數位長度和階碼位長度不同,因此對浮點數的表示有較大差別,這不利于軟件在不同計算機之間的移植。為此,美國IEEE(電器及電子工程師協會)提出了一個從系統角度支持浮點數的表示方法,稱為IEEE754標準(IEEE,1985),當今流行的計算機幾乎都采用了這一標準。