24
 double d = 4.321562;

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

4

3 に答える 3

32

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

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

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

于 2011-05-29T08:44:45.183 に答える
28

数学を使用せずに分数を取得する別の方法は、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数値で使用する計算で発生する可能性があります。

于 2011-05-29T08:59:27.307 に答える
10

モジュロを使用:

double d = 3.123 % 1;
assertEquals(0.123, d,0.000001);
于 2012-07-30T15:19:33.867 に答える