Java.lang.Double
をJava.lang.Integer
にキャストする方法はありますか?
例外が発生します
"Java.lang.ClassCastException:Java.lang.DoubleはJava.lang.Integerと互換性がありません"
Double
はInteger
ではないので、キャストは機能しません。 Double
class とdouble
プリミティブ の違いに注意してください。 Double
はNumber
、 なので、メソッドintValue
があります。これを使用して、値をプリミティブint
として取得できます。
このように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
は不変オブジェクトなので、それらを変更することはできません。
class の各数値には、 プリミティブ という選択肢があります(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
しかし、上記のコードでカバーされていないことがたくさんあります。上記のコードは 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());
今ではほとんどの値に対してうまくいきます。しかし、整数はDouble
と比較して非常に小さい範囲(最小/最大値)を持ちます。それに加えて、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);
あなたは auto-(un)boxing を使いたくなるかもしれませんが、私はそうは思わないでしょう。もう行き詰まっているのであれば、次の例もそれほど明白ではないでしょう。あなたが自動(アン)ボクシングの内部の仕組みを理解していないならば、それを使わないでください。
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
3つの可能性があります。最初の2つは数字を切り捨て、最後の2つは最も近い整数に丸めます。
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
このような:
Double foo = 123.456;
Integer bar = foo.intValue();
実際、最も簡単な方法はintValue()
を使うことです。ただし、これは単に整数部分を返します。丸めは行われません。 Doubleの値に整数の 最も近い が必要な場合は、これを行う必要があります。
Integer integer = Integer.valueOf((int) Math.round(myDouble)));
そして、ヌルケースを忘れないでください。
Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));
Math.round()
は、無限やNaNのような奇妙なアヒルの場合を、相対的な優雅さで扱います。
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 doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
これを行うには、 "Narrowing or Explicit type conversion"、double→long→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とIntegerは、それぞれdoubleとintのJavaプリミティブのラッパークラスです。あなたはそれらの間でキャストすることができますが、あなたは浮動小数点を失います。つまり、intにキャストされた5.4は5になります。キャストし直すと5.0になります。
doubleNumber.intValue();
メソッドを使用してください。
DoubleのintValueメソッドを使うだけです
Double initialValue = 7.12;
int finalValue = initialValue.intValue();
Doubleの既に作成されたインスタンスを共有するため、メモリ効率がよくなります。
Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()