web-dev-qa-db-ja.com

小数点以下の数字を取得する方法は? (Java)

 double d = 4.321562;

Dから独自に0.321562を抽出する簡単な方法はありますか?数学の授業を試しましたが、運はありませんでした。これを文字列に変換したり、他のものにキャストしたりせずに実行できる場合は、さらに良いでしょう。

23
David

さて、あなたは使用することができます:

double x = d - Math.floor(d);

元の値がexactly 4.321562ではないため、バイナリ浮動小数点の動作方法によりexactly 0.321562が得られないことに注意してください。正確な数字に本当に興味がある場合は、代わりにBigDecimalを使用する必要があります。

30
Jon Skeet

Mathを使用せずに分数を取得する別の方法は、longにキャストすることです。

double x = d - (long) d;

doubleを出力すると、toStringは少量の丸めを実行するため、丸めエラーは発生しません。ただし、整数部分を削除すると、丸めが不十分になり、丸め誤差が明らかになります。

これを回避する方法は、自分で丸めを行うか、丸めを制御できるBigDecimalを使用することです。

double d = 4.321562;
System.out.println("Double value from toString " + d);
System.out.println("Exact representation " + new BigDecimal(d));
double x = d - (long) d;
System.out.println("Fraction from toString " + x);
System.out.println("Exact value of fraction " + new BigDecimal(x));
System.out.printf("Rounded to 6 places %.6f%n", x);
double x2 = Math.round(x * 1e9) / 1e9;
System.out.println("After rounding to 9 places toString " + x2);
System.out.println("After rounding to 9 places, exact value " + new BigDecimal(x2));

プリント

Double value from toString 4.321562
Exact representation 4.321562000000000125510268844664096832275390625
Fraction from toString 0.3215620000000001
Exact value of fraction 0.321562000000000125510268844664096832275390625
Rounded to 6 places 0.321562
After rounding to 9 places toString 0.321562
After rounding to 9 places, exact value 0.32156200000000001448796638214844278991222381591796875
27
Peter Lawrey

モジュロを使用:

double d = 3.123 % 1;
assertEquals(0.123, d,0.000001);
9