原因
之前用C++敲代碼,用科學技術法一直都是寫的整數類型,現在到Java里面發現居然報錯,是個浮點數。
//不報錯
int a = 1e5 + 10;
//報錯
int a = 1e5 + 10;
float a = 1e5 + 10;
//不報錯
double a = 1e5 + 10;
關於Java的科學計數法
在Java中,當Double的取值符合某條件時,將會以科學計數法的方式顯示(下面是個人測試的結果,非從文檔中得到的結論):
@Test
public void testPrintScientificNotation() {
//整數部分位數大於等於8時開始以科學計數法顯示
System.out.println(-12345678.0);
System.out.println(12345678.0);
//整數位為0,當小數位以0開始連續出現大於等於3時開始以科學計數法顯示
System.out.println(0.0001);
System.out.println(-0.0001);
}
結果
-1.2345678E7
1.2345678E7
1.0E-4
-1.0E-4
很多時候,我們需要做一個統一,要么全部以科學計數法輸出,要么就全部顯示為普通計數。根據網上的資料,主要提及NumberFormat、DecimalFormat、BigDecimal這三種API實現方式。
(詳情請看文末的參考)
***
0x表示
- 如果你寫一個0x80;那么會把這0,1位串在內存中鋪開,並且是32位的一個int,不夠32位,則前面補0。
- 如果在強制轉換成一個byte,則會把前面全部截掉,保留后8位。
- 如果是0x80L,則是64位的。
一次如果你想直接用位來表示數字就可以寫成0x的形式。
public class Test {
public static void main(String[] args) {
int a = 0x2f;//小寫十六進制(等價於0x002f)
System.out.println(Integer.toBinaryString(a)); //101111
int b = 0x2F;//大寫十六進制
System.out.println(Integer.toBinaryString(b)); //101111
int c = 10;//標准十進制
System.out.println(Integer.toBinaryString(c)); //1010
int d = 010;//以零開頭,表示八進制
System.out.println(Integer.toBinaryString(d)); //1000
char e = 0xff;//char為2個字節,16位
byte f = 0xf;//byte為8位
short g = 0xff;//short為2個字節,16位
System.out.println(Integer.toBinaryString(e)); //11111111
System.out.println(Integer.toBinaryString(f)); // 1111
System.out.println(Integer.toBinaryString(g)); //11111111
}
}
判斷變量類型
第一種:反射
使用反射的方法: 變量名.getClass().getSimpleName()來判斷。這個可以判斷科學計數法表示的變量,但需要強轉Object類型。
例:
public static void main(String[] args ){
double a = 1e5 + 10;
//必須要轉成object這樣才能用反射判斷類型
Object aa = (Object)a;
System.out.println( aa.getClass().getSimpleName() );
}
第二種:instanceof
這種也是無法直接判斷,需要強轉Object
public static void main(String[] args ){
double a = 1e5 + 10;
Object aa = (Object)a;
//注意這里不要instanceof int會報錯,我嘗試的時候還以為instance無法判斷,后面想到可能是包裝類的問題
System.out.println( (aa instanceof Integer ));
}
結果:
參考: