double d = 4.321562;
Dから独自に0.321562を抽出する簡単な方法はありますか?数学の授業を試しましたが、運はありませんでした。これを文字列に変換したり、他のものにキャストしたりせずに実行できる場合は、さらに良いでしょう。
さて、あなたは使用することができます:
double x = d - Math.floor(d);
元の値がexactly 4.321562ではないため、バイナリ浮動小数点の動作方法によりexactly 0.321562が得られないことに注意してください。正確な数字に本当に興味がある場合は、代わりにBigDecimal
を使用する必要があります。
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
モジュロを使用:
double d = 3.123 % 1;
assertEquals(0.123, d,0.000001);