Scanner input = new Scanner(System.in);
double grade = input.nextInt(); // 編譯通過,運行正常
直覺認為應用 nextDouble(),為何 nextInt() 也能賦值給 double?
int → double 屬於擴寬基本類型轉換,無損精度(32 位有符號整數範圍完全包含於 53 位雙精度尾數範圍),編譯器自動插入轉換指令,無需強制轉型。double → int 屬於窄化轉換,可能丟失精度或溢出,必須顯式強制轉型:int i = (int) input.nextDouble();。| 方法 | 讀取類型 | 適用輸入 | 異常情況 |
|---|---|---|---|
nextInt() | int | 整數字面量(如 42、-7) | 輸入 3.14 拋 InputMismatchException |
nextDouble() | double | 整數/小數/科學計數法(42、3.14、1e-3) | 輸入 abc 拋 InputMismatchException |
根據業務語義選擇:期望整數用 nextInt(),期望實數用 nextDouble()。若統一用 double 接收再判斷是否為整數,可用 nextDouble() 配合 Math.floor() 比較,但會接受 3.0 這類輸入,需權衡嚴格度。