回答:
A Double
はでないInteger
ため、キャストは機能しません。Double
クラスとdouble
プリミティブの違いに注意してください。また、a Double
はa Number
であることに も注意してください。このメソッドintValue
には、プリミティブとして値を取得するために使用できるメソッドがありますint
。
intValue()
。
intValue()
単ににキャストさdouble
れますint
。
次のようにメソッドintValue()を使用して、明示的にint値を取得する必要があります。
Double d = 5.25;
Integer i = d.intValue(); // i becomes 5
または
double d = 5.25;
int i = (int) d;
2^31 - 1 (Integer.MAX_VALUE)
はオーバーフローします。
1.6 -> 1
、1.4 -> 1
、-1.6 -> -1
、-1.4 -> -1
、
落とし穴をカバーし、その背後にある理由なしに他の答えを理解することは不可能だと思います。
あなたは直接キャストすることはできませんInteger
にDouble
オブジェクト。またDouble
、Integer
不変オブジェクトであるため、変更することはできません。
各数値クラスには、プリミティブな代替(Double
vsdouble
、Integer
vs 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セーフではありません。
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);
これで自動(非)ボクシングを使用したくなるかもしれませんが、私はしません。既に行き詰まっている場合は、次の例もそれほど明白ではありません。自動(非)ボクシングの内部動作を理解していない場合は、使用しないでください。
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つは数字を切り捨て、最後の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
このような:
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()
infinityやNaNのような奇妙なアヒルのケースを比較的優雅に扱います。
double a = 13.34;
int b = (int) a;
System.out.println(b); //prints 13
Double d = 100.00;
Integer i = d.intValue();
また、オートボクシングで動作することも追加する必要があります。
それ以外の場合は、int(プリミティブ)を取得し、そこからIntegerを取得できます。
Integer i = new Integer(d.intValue());
new Integer(int)
使用せず、代わりにを使用してくださいInteger.valueOf(int)
。
それは私のために働いた。これを試して:
double od = Double.parseDouble("1.15");
int oi = (int) od;