web-dev-qa-db-ja.com

double to intキャストはJava

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

26
peter

JLSの セクション5.1. にすべて記載されています。

最初のステップでは、浮動小数点数は、Tが長い場合は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番目のステップは、Tintの場合は無関係です。)

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

16
Jon Skeet

(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を使用しない限り...

13
arutaku

Java仕様を読んでください:

http://docs.Oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.

関連するセクションは5.1.3-"Narrowing Primitive Conversion"です。

2
mikera