JavaでDoubleをIntegerにキャストする


348

にキャストjava.lang.Doubleする方法はありjava.lang.Integerますか?

例外をスローします

「java.lang.ClassCastException:java.lang.Double injava.lang.Integerと互換性がない」

回答:


464

A DoubleはでないIntegerため、キャストは機能しません。Double クラスdouble プリミティブの違いに注意してください。また、a Doubleはa Numberあることに も注意してください。このメソッドintValueには、プリミティブとして値を取得するために使用できるメソッドがありますint


2
キャストしないでください。13.22222ではなく13など、DoubleからIntegerオブジェクトを取得する必要があります。
4lex1v 2012

181
ただ電話してくださいintValue()
hvgotcodes

6
nullを処理することを忘れないでください。
pimlottc 2014年

13
これは単にDoubleの整数部分を返すだけなので、13.666667または13.9の場合、14ではなく13が返されることに注意してください。最も近い整数が必要な場合は、私の答えを参照してください:stackoverflow.com/a/24816336/1450294
マイケルシェパー14

2
の実装を見ると、intValue()単ににキャストさdoubleれますint
carlo.marinangeli 2015

565

次のようにメソッドintValue()を使用して、明示的にint値を取得する必要があります。

Double d = 5.25;
Integer i = d.intValue(); // i becomes 5

または

double d = 5.25;
int i = (int) d;

67
ありがとうございました。非常に明確な。私にとって、受け入れられた答えは、ばかげた質問をすることを叱るようなものです。しかし、あなたの答えはとても寛大です。
Buddhika Ariyaratne 14

2
double値が整数の範囲外の場合はどうなりますか?(2 ^ 33など)
nikdeapen 14年

5
double値> 2^31 - 1 (Integer.MAX_VALUE)はオーバーフローします。
anubhava 2014年

3
ちなみに、doubleからintにキャストすると、正の数と負の数の両方について整数部分のみが保持され、丸めは問題になりません。例えば1.6 -> 11.4 -> 1-1.6 -> -1-1.4 -> -1
エリック王

51

落とし穴をカバーし、その背後にある理由なしに他の答えを理解することは不可能だと思います。

あなたは直接キャストすることはできませんIntegerDoubleオブジェクト。またDoubleInteger不変オブジェクトであるため、変更することはできません。

各数値クラスには、プリミティブな代替(DoublevsdoubleIntegervs int、...)があります。これらのプリミティブは小文字で始まることに注意してください(例:)int。これは、それらがクラス/オブジェクトではないことを示しています。これは、メソッドがないことも意味します。対照的に、クラス(たとえばInteger)は、これらのプリミティブの周りのボックス/ラッパーのように動作し、オブジェクトのように使用することができます。

戦略:

変換するには Doubleには、Integer次の戦略に従う必要があります。

  1. Doubleオブジェクトをプリミティブに変換しますdouble。(= "開梱")
  2. プリミティブを変換する doubleをにintます。(=「キャスティング」)
  3. プリミティブを変換する intIntegerオブジェクトに戻します。(=「ボクシング」)

コードで:

// 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セーフではありません。

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は「特別な値」を保持することもできますが、整数は次のことはできません。

  • 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

valueOfを優先:

また、new Integer()(他のいくつかの回答が提案するように)コンストラクターを使用するように誘惑されないでください。これらのvalueOf()メソッドはキャッシングを使用するため、より優れています。これらのメソッドを使用することは、時々メモリを節約するため、良い習慣です。

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory

1
私の意見ではこれが最良の答えです
トール

39

私には3つの可能性があります。最初の2つは数字を切り捨て、最後の1つは最も近い整数に丸めます。

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

21
結果をprimitieve intに格納する場合は、Integer.valueOfは必要ありません。コードにより、Javaに不要なボックスとボックスの解除を強制します。
bvdb


23

実際、最も簡単な方法はを使用することintValue()です。ただし、これは単に整数部分を返すだけです。丸めは行いません。Double値に最も近い整数が必要な場合は、次のようにする必要があります。

Integer integer = Integer.valueOf((int) Math.round(myDouble)));

そして、ヌルケースを忘れないでください:

Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));

Math.round() infinityやNaNのような奇妙なアヒルのケースを比較的優雅に扱います。


2
Math.roundの結果をintにキャストする場合、なぜInteger.valueOfが必要なのですか?
Eran H.

@EranH .: Java 1.5以降では、おそらくそうではありません。オートボクシングとは、コードがどちらの方法でも同じことを行う可能性が高いことを意味します。しかし、このコードは、オブジェクトやプリミティブをまだ十分に理解していない人にとっては、より明確であると思います。
Michael Scheper、2015年

誰がこの回答に反対票を投じたのか:理由を説明すれば、コミュニティをさらに支援できます。また、コミュニティがうまくいかなかった理由を見つけるのに役立つかもしれません。説明なしの投票、OTOHは誰にとっても役に立たず、臆病なように出くわします。
Michael Scheper

14
double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13

2
問題は特にラッパークラスに関するものでした。この答えはプリミティブについてです。
Michael Scheper 2014


7
Double d = 100.00;
Integer i = d.intValue();

また、オートボクシングで動作することも追加する必要があります。

それ以外の場合は、int(プリミティブ)を取得し、そこからIntegerを取得できます。

Integer i = new Integer(d.intValue());

2
このような小さな整数のキャッシュを持つをnew Integer(int)使用せず、代わりにを使用してくださいInteger.valueOf(int)
bvdb 2014年


4

「ナローイングまたは明示的な型変換」を使用して、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に絞り込みます。しかし、他の人にとっては、魔法をかけます。


4

これをお試しください

double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();

3

DoubleとIntegerは、それぞれdoubleとintのJavaプリミティブのラッパークラスです。それらの間でキャストできますが、浮動小数点は失われます。つまり、intにキャストされた5.4は5になります。キャストバックすると、5.0になります。


0

DoubleのintValueメソッドを使用するだけです

Double initialValue = 7.12;
int finalValue = initialValue.intValue();

2
他の答えの繰り返しのようです。
2017年


-1

すでに作成されているDoubleのインスタンスを共有するため、メモリ効率が良い。

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()

理由はありMath.floor(...)ますか? intValue()とにかくいつも床に。
bvdb

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.