web-dev-qa-db-ja.com

Javaでダブルを分割するときの奇妙な動作

Java doublesを使用して317を219で除算すると、1になります。
例えば:

double b = 317/219;
System.out.println(b);

出力は:1。

これは繰り返し10進数だからですか?煩わしいBigDecimalを代わりに使用する必要がありました。

16
Joe

これを試して

 double b = 317/219D;

Java=のコード化された数値のデフォルトのタイプはintであるため、現在のコードではJavaは2つのintの数値と除算の結果もintとなり、小数部が切り捨てられて1の最終結果が得られます。このintの結果はキャストされます拡張キャストであるため、コンパイラの警告なしにint 1からdouble 1へ(ソースタイプがターゲットタイプに「適合する」ことが保証されているもの)。

いずれかの数値をdoubleとして末尾にDを付けてコーディングします(dも使用できますが、Lが小文字であるため、常に大文字を使用しますl1)のように見えます。除算の結果もdoubleになります。

28
Bohemian

別の選択肢...

double b = (double)317/219;
5
xagyg

これは、整数リテラルを使用したため、整数除算を行っているためです。

double b = 317.0/219.0;代わりに。

3

実行時にサンプルに分割がないことは言及する価値があります。 317/219はコンパイル時に計算され(整数の除算、小数は破棄されます)、定数で置き換えられます。 .classを逆コンパイルすると(私はJad http://www.kpdus.com/jad.html を使用しました)、

double b = 1.0D;
2

これはint除算です。書く:

double b = 317.0/219;
System.out.println(b);
0
bellum

あなたが置く数字は整数なので、答えもそうです。
doubleを取得するには、浮動小数点数を使用するか、使用する整数の1つをキャストする必要があります。

double b = 317.0/219;
System.out.println(b);

または:

double b = ((double)317)/219;
System.out.println(b);
0
Ofir Luzon