web-dev-qa-db-ja.com

Javaで整数にキャストする

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

例外が発生します

"Java.lang.ClassCastException:Java.lang.DoubleはJava.lang.Integerと互換性がありません"

320
4lex1v

DoubleIntegerではないので、キャストは機能しません。 Double class double プリミティブ の違いに注意してください。 DoubleNumberなので、メソッドintValueがあります。これを使用して、値をプリミティブintとして取得できます。

429
hvgotcodes

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

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

または

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

の落とし穴やその背後にある推論 をカバーせずに他の答えを理解するのは不可能だと思います。

IntegerDoubleオブジェクトに直接キャストすることはできません。またDoubleIntegerは不変オブジェクトなので、それらを変更することはできません。

class の各数値には、 プリミティブ という選択肢があります(DoubledoubleIntegerint、...)。これらのプリミティブは小文字で始まることに注意してください(例:int)。それはそれらがクラス/オブジェクトではないことを私たちに伝えます。これはまた、メソッドがないことを意味します。対照的に、クラス(例えばInteger)はこれらのプリミティブを囲むボックス/ラッパーのように振る舞い、オブジェクトのようにそれらを使用することを可能にします。

戦略:

DoubleIntegerに変換するには、以下の戦略に従う必要があります。

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

  • 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);

自動ボクシング解除

あなたは 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

ValueOfを優先する

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

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

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
37
squit

このような:

Double foo = 123.456;
Integer bar = foo.intValue();
21

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

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

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

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

Math.round()は、無限やNaNのような奇妙なアヒルの場合を、相対的な優雅さで扱います。

21
Michael Scheper
double a = 13.34;
int b = (int) a;

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

このようにしてください。

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
7
Sunil Sharma
Double d = 100.00;
Integer i = d.intValue();

オートボクシングでも機能することを付け加えるべきです。

そうでなければ、int(プリミティブ)を取得し、そこからIntegerを取得することができます。

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

DoubleオブジェクトでintValue()を呼び出します。

これを試してください

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

これを行うには、 "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に絞り込まれます。しかし他の人にとっては魔法のようになります。

3
Sarthak Bhatia

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

2
OnResolve

doubleNumber.intValue();メソッドを使用してください。

0
PanTau

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

Double initialValue = 7.12;
int finalValue = initialValue.intValue();
0
ravi ranjan

Doubleの既に作成されたインスタンスを共有するため、メモリ効率がよくなります。

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