java.lang.Doubleを
java.lang.Integer` にキャストする方法はありますか?
例外がスローされる
"java.lang.ClassCastException: java.lang.Double incompatible with java.lang.Integer"
Doubleは
Integerではないので、キャストはうまくいきません。 Double
class と double
primitive の違いに注意してください。 また、Double
は Number
であり、メソッド intValue
を持っているので、それを使ってプリミティブな int
として値を取得できることに注意してください。
その背後にある落とし穴と推論をカバーせずに他の答えを理解することは不可能だと思います。
「整数」を「ダブル」オブジェクトに直接キャストすることはできません。 また、「ダブル」と「インテガー」は不変のオブジェクトなので、変更することはできません。
各数値クラスにはプリミティブ代替( Double
vs double
、 Integer
vs int
、。 ...)。 これらのプリミティブは小文字の文字で始まることに注意してください(例:. int
)。 これは、クラス/オブジェクトではないことを示しています。 これは、メソッドがないことも意味します。 対照的に、クラス(例:. Integer
)これらのプリミティブの周りのボックス/ラッパーのように動作するため、オブジェクトのように使用できます。
「ダブル」を「インテガー」に変換するには、次の戦略に従う必要があります。
1。 Double
オブジェクトをプリミティブ double
に変換します。 (=「アンボックス」)。
2。 プリミティブ「ダブル」をプリミティブ「イント」に変換します。 (=「キャスティング」)。
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
ただし、上記のコードではカバーされていないことがたくさんあります。 上記のコードは null-safeではありません。。
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());
今では、ほとんどの値で正常に動作します。 ただし、整数は「ダブル」と比較して非常に小さい範囲(最小/最大値)です。 その上、ダブルスは「特別な値」を保持することもでき、整数は次のことはできません。
-1/0 = +無限。 -1/0 =-無限。 -0/0 =未定義(NaN)。
したがって、アプリケーションによっては、厄介な例外を回避するためにフィルタリングを追加することをお勧めします。
次に、次の欠点は丸め戦略です。 デフォルトでは、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
実際、最も簡単な方法は「intValue()」を使用することです。 ただし、これは整数部分を返すだけです。丸めは行いません。 Integer _nearest_をDouble値にする場合は、これを行う必要があります。
Integer integer = Integer.valueOf((int) Math.round(myDouble)));
そして、nullケースを忘れないでください:
Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));
Math.round()
は、無限大やNaNのような奇妙なアヒルのケースを比較的優雅に扱います。
「狭義または明示的な型変換」を使用してそれを行うことができます。 ダブル→ロング→int。 うまくいくといいですね。
double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l; // Explicit type casting required
PS:doubleにはすべての10進値があり、左側には何もないため、0になります。 0.58の場合、0に絞り込みます。 しかし、他の人にとってはそれは魔法をかけるでしょう。
これを試してみてください。
double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
それは私のために働いた。 これを試して:
double od = Double.parseDouble("1.15");
int oi = (int) od;