java 數據類型
引用類型
基本數據類型:
boolean 佔 1 個二進制位
byte 8
char 16
short 16
int 32
long 64
float 32
double 64
第一個二進制位表示符號位 0 表示 正數,1 表示爲負數.
對於單精度浮點數來說第一個二進制位表示符號位,後2-9個二進制位用來表示指數,後23個二進制位則用來表示尾數。
浮點數進行運算是有可能是會損失精度的,例如:
System.out.println(1.0 - 0.9);
//結果爲 0.09999999999999998
出現這種情況的原因爲:java 中浮點默認是用 double 類型的,計算機在處理數據的時候先把數據轉爲二進制,但是小數轉二進制就會損答精度,例如:0.1(十進制) 要轉到二進制,
0.1 * 2 = 0.2 取 正數部份 0
0.2 * 2 = 0.4 0
0.4 * 2 = 0.8 0
0.8 * 2 = 1.6 1
0.6 * 2 = 1.2 1
0.2 * 2 = 0.4 0
...... ......
這樣是永遠不會等於零的,就像10 除以 3 一樣,無限循環,但是double類型的數據只佔那麼多個二進制位,所以在在轉向二進制的時候就相對數值會小一點點(非常小),所以結果會出現 0.09999999999999998這樣的結果,JDK 會提供了一個可以求任意精度數值的一個類——BigDecimal。
float f1 = 1.22222222222222222222222222222222222222222222222f;
float f2 = 1.00000000000000000000000000000000000000000000001f;
System.out.println("f1 - f2 = "+(f1 - f2));
BigDecimal b1 = new BigDecimal("1.22222222222222222222222222222222222222222222222");
BigDecimal b2 = new BigDecimal("1.00000000000000000000000000000000000000000000001");
BigDecimal subtract = b1.subtract(b2);
System.out.println("b1 - b2 = "+subtract);
//打印的結果
//f1 - f2 = 0.22222221
//b1 - b2 = 0.22222222222222222222222222222222222222222222221
&與運算
&& 短路與
int i = 1;
if (i > 0 & i++ > 1) {
}
System.out.println(i);
int j = 1;
if (j < 0 && j++ > 1) {
}
System.out.println(j);
//打印結果: 2 1
與運算符會兩邊的表達示都會進行計算,就算編繹器知道了第一個表達式爲false,而短路與則不同,在上述例子中 當 j < 0 是等於 false 時,這時整個表達式己經確定爲false 了,所以編繹器對第二個表達式是不進算運算的,所以打印的結果爲 n = 1
^ 異或運算符
int a = 3;
int b = 4;
System.out.println(a ^ b);
//打印結果: 7
011
^100
111
異或運算當兩個二進制位相同則等於0,不相同則等於1