首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 輸入陷阱:為什麼 double grade = input.nextInt() 能編譯運行?

     編輯:程式設計綜合問答

代碼現象

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 這類輸入,需權衡嚴格度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved