double d = 4.321562;
d から 0.321562 を単独で抽出する簡単な方法はありますか? 数学の授業を調べてみましたが、うまくいきませんでした。文字列に変換したり、他のものにキャストしたりせずにこれを実行できる場合は、さらに優れています。
double d = 4.321562;
d から 0.321562 を単独で抽出する簡単な方法はありますか? 数学の授業を調べてみましたが、うまくいきませんでした。文字列に変換したり、他のものにキャストしたりせずにこれを実行できる場合は、さらに優れています。
さて、あなたは使うことができます:
double x = d - Math.floor(d);
元の値が正確に4.321562 ではないため、2 進浮動小数点の動作方法により、正確に 0.321562 が得られないことに注意してください。正確な数字に本当に関心がある場合は、BigDecimal
代わりに使用する必要があります。
数学を使用せずに分数を取得する別の方法は、longにキャストすることです。
double x = d - (long) d;
toStringをdouble
出力すると、少量の丸めが実行されるため、丸め誤差は発生しません。ただし、整数部分を削除すると、丸めが不十分になり、丸め誤差が明らかになります。
これを回避する方法は、自分で丸めを行うか、丸めを制御できる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
精度には制限があり、適切な丸めを使用しないと、表現の問題が忍び寄る可能性があります。double
これは、2の累乗の正確な合計ではないesp数値で使用する計算で発生する可能性があります。
モジュロを使用:
double d = 3.123 % 1;
assertEquals(0.123, d,0.000001);