28

私は Java が初めてで、double から int へのキャストがどのように機能するのか疑問に思っています。下位32ビットを取得することで long から int への変換が簡単であることは理解していますが、 double (64 ビット) から int (32 ビット) への変換はどうでしょうか? バイナリの double からの 64 ビットは倍精度浮動小数点形式 (仮数部) になっているため、内部でどのように int に変換されますか?

4

3 に答える 3

20

これはすべて、JLS のセクション 5.1.3に記載されています。

最初のステップでは、次のように、浮動小数点数は、T が long の場合は long に、T が byte、short、char、または int の場合は int に変換されます。

浮動小数点数が NaN (§4.2.3) の場合、変換の最初のステップの結果は int または long 0 です。

  • それ以外の場合、浮動小数点数が無限大でない場合、浮動小数点値は整数値 V に丸められ、IEEE 754 ゼロ方向への丸めモード (§4.2.3) を使用してゼロ方向に丸められます。次に、2 つのケースがあります。

    • T が long で、この整数値が long として表現できる場合、最初のステップの結果は long 値 V になります。

    • それ以外の場合、この整数値が int として表現できる場合、最初のステップの結果は int 値 V になります。

  • それ以外の場合は、次の 2 つのケースのいずれかに該当する必要があります。

    • 値は小さすぎる必要があり (大きさが大きい負の値または負の無限大)、最初のステップの結果は int または long 型の表現可能な最小値になります。

    • 値は大きすぎる必要があり (大きさが大きい正の値または正の無限大)、最初のステップの結果は int または long 型の表現可能な最大値になります。

( が の場合、ここでの 2 番目のステップは無関係Tですint。)

ほとんどの場合、これはハードウェア サポートを使用して実装されることを期待しています。浮動小数点数を整数に変換することは、通常 CPU によって処理されます。

于 2012-09-20T14:38:21.573 に答える
14

お気づきかもしれませんが、(int) キャストを使用すると、Java はその値を切り捨てます。

    double d = 2.4d;
    int i = (int) d;
    System.out.println(i);
    d = 2.6;
    i = (int) d;
    System.out.println(i);

出力:

2
2

Math.round、Math.ceil、Math.floor を使用しない限り...

于 2012-09-20T14:40:59.123 に答える
2

Java仕様を読むことをお勧めします。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3

関連するセクションは5.1.3-「プリミティブ変換のナローイング」です。

于 2012-09-20T14:39:03.273 に答える