[英]Cast Double to Integer in Java
任何將java.lang.Double
為java.lang.Integer
?
它拋出異常
“java.lang.ClassCastException:java.lang.Double 與 java.lang.Integer 不兼容”
您需要使用方法 intValue() 顯式獲取 int 值,如下所示:
Double d = 5.25;
Integer i = d.intValue(); // i becomes 5
要么
double d = 5.25;
int i = (int) d;
我認為如果不涵蓋背后的陷阱和推理,就不可能理解其他答案。
您不能直接將Integer
轉換為Double
對象。 Double
和Integer
也是不可變對象,因此您不能以任何方式修改它們。
每個數字類都有一個原始選擇( Double
與double
, Integer
與int
,...)。 請注意,這些原語以小寫字符開頭(例如int
)。 這告訴我們它們不是類/對象。 這也意味着他們沒有方法。 相比之下,類(例如Integer
)就像圍繞這些原語的盒子/包裝器一樣,這使得可以像使用對象一樣使用它們。
要將Double
轉換為Integer
您需要遵循以下策略:
Double
對象轉換為原始double
。 (= "開箱")double
轉換為原始int
。 (=“鑄造”)int
轉換回Integer
對象。 (= "拳擊")// starting point
Double myDouble = Double.valueOf(10.0);
// step 1: unboxing
double dbl = myDouble.doubleValue();
// step 2: casting
int intgr = (int) dbl;
// step 3: boxing
Integer val = Integer.valueOf(intgr);
其實有捷徑。 您可以立即從Double
直接拆箱到原始int
。 這樣,您就可以完全跳過第 2 步。
Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way
但是,上面的代碼中還有很多東西沒有涉及。 上面的代碼不是空安全的。
Double myDouble = null;
Integer val = Integer.valueOf(myDouble.intValue()); // will throw a NullPointerException
// a null-safe solution:
Integer val = (myDouble == null)? null : Integer.valueOf(myDouble.intValue());
現在它適用於大多數值。 然而,與Double
相比,整數的范圍非常小(最小值/最大值)。 最重要的是,雙打還可以保存“特殊值”,而整數不能:
因此,根據應用程序,您可能需要添加一些過濾來避免令人討厭的異常。
然后,下一個缺點是舍入策略。 默認情況下,Java 將始終向下舍入。 在所有編程語言中,四舍五入都非常有意義。 基本上,Java 只是丟棄了一些字節。 在金融應用程序中,您肯定希望使用半舍入(例如: round(0.5) = 1
和round(0.4) = 0
)。
// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = Integer.valueOf(rounded);
您可能會想在此使用自動(取消)裝箱,但我不會。 如果您現在已經陷入困境,那么接下來的示例也不會那么明顯。 如果您不了解自動(取消)裝箱的內部工作原理,請不要使用它。
Integer val1 = 10; // works
Integer val2 = 10.0; // doesn't work
Double val3 = 10; // doesn't work
Double val4 = 10.0; // works
Double val5 = null;
double val6 = val5; // doesn't work (throws a NullPointerException)
我想以下不應該是一個驚喜。 但如果是這樣,那么您可能想閱讀一些關於在 Java 中進行轉換的文章。
double val7 = (double) 10; // works
Double val8 = (Double) Integer.valueOf(10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense
另外,不要試圖使用new Integer()
構造函數(正如其他一些答案所建議的那樣)。 valueOf()
方法更好,因為它們使用緩存。 使用這些方法是一個好習慣,因為它們有時會為您節省一些內存。
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
我看到了三種可能性。 前兩個截斷數字,最后一個四舍五入到最接近的整數。
double d = 9.5;
int i = (int)d;
//i = 9
Double D = 9.5;
int i = Integer.valueOf(D.intValue());
//i = 9
double d = 9.5;
Long L = Math.round(d);
int i = Integer.valueOf(L.intValue());
//i = 10
事實上,最簡單的方法是使用intValue()
。 但是,這僅返回整數部分; 它不做任何舍入。 如果您希望 Integer最接近Double 值,則需要執行以下操作:
Integer integer = Integer.valueOf((int) Math.round(myDouble)));
並且不要忘記 null 情況:
Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));
Math.round()
以相對優雅的方式處理奇數的鴨子情況,例如無窮大和 NaN。
像這樣:
Double foo = 123.456;
Integer bar = foo.intValue();
double a = 13.34;
int b = (int) a;
System.out.println(b); //prints 13
簡單地這樣做...
Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
Double d = 100.00;
Integer i = d.intValue();
還應該補充一點,它適用於自動裝箱。
否則,您會得到一個 int (原始),然后可以從那里得到一個 Integer:
Integer i = new Integer(d.intValue());
在Double
對象上調用intValue()
。
您可以通過使用“縮小或顯式類型轉換”,double → long → int 來實現。 我希望它會起作用。
double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l; // Explicit type casting required
PS:它將給出 0,因為 double 具有所有十進制值,左側沒有任何內容。 在 0.58 的情況下,它將縮小到 0。但對於其他人,它會發揮作用。
試試這個
double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
Double 和 Integer 分別是 double 和 int 的 Java 原語的包裝類。 您可以在這些之間進行轉換,但您將丟失浮點數。 也就是說,將 5.4 轉換為 int 將是 5。如果將其轉換回來,它將是 5.0。
或者,可以先轉換為原始double
,然后轉換為int
,讓它自動裝箱為Integer
。
Double d = 20.3;
Integer i = (int) (double) d; //20
//To obtain primitive:
int i2 = (int) (double) d;
使用doubleNumber.intValue();
方法。
只需使用 Double 的 intValue 方法
Double initialValue = 7.12;
int finalValue = initialValue.intValue();
內存高效,因為它將共享已創建的 Double 實例。
Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()
它對我有用。 試試這個:
double od = Double.parseDouble("1.15");
int oi = (int) od;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.