簡體   English   中英

在 Java 中將雙精度轉換為整數

[英]Cast Double to Integer in Java

任何將java.lang.Doublejava.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;

Double不是Integer ,因此演員表將不起作用。 請注意Doubledouble原語之間的區別。 另請注意, Double是一個Number因此它具有intValue 方法,您可以使用該方法將值作為原始int

我認為如果不涵蓋背后的陷阱和推理,就不可能理解其他答案。

您不能直接將Integer轉換為Double對象。 DoubleInteger也是不可變對象,因此您不能以任何方式修改它們。

每個數字都有一個原始選擇( DoubledoubleIntegerint ,...)。 請注意,這些原語以小寫字符開頭(例如int )。 這告訴我們它們不是類/對象。 這也意味着他們沒有方法。 相比之下,類(例如Integer )就像圍繞這些原語的盒子/包裝器一樣,這使得可以像使用對象一樣使用它們。

戰略:

要將Double轉換為Integer您需要遵循以下策略:

  1. Double對象轉換為原始double (= "開箱")
  2. 將原始double轉換為原始int (=“鑄造”)
  3. 將原始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相比,整數的范圍非常小(最小值/最大值)。 最重要的是,雙打還可以保存“特殊值”,而整數不能:

  • 1/0 = +無窮大
  • -1/0 = -無窮大
  • 0/0 = 未定義 (NaN)

因此,根據應用程序,您可能需要添加一些過濾來避免令人討厭的異常。

然后,下一個缺點是舍入策略。 默認情況下,Java 將始終向下舍入。 在所有編程語言中,四舍五入都非常有意義。 基本上,Java 只是丟棄了一些字節。 在金融應用程序中,您肯定希望使用半舍入(例如: round(0.5) = 1round(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM