0

問題があります。数学的計算を実行できるアプリケーションを開発しています。これらの計算は正確でなければなりません (または明らかに間違っていない)。

しかし、この単純なコード

double a = 3.048d;
double b = 1000d;

double c = a / b;

間違った結果が得られます c は期待どおりの 0.003048 ではなく、明らかに間違っている 0.0030480000000000004 です。

double d = 3.048 / 1000; 

この 2 番目のコード スニペットでは、正しい結果が得られます。

コンピューターで計算する場合、すべての浮動小数点演算が正確ではないことは承知していますが、この問題を解決する方法がわかりません。

前もって感謝します!
ルートヴィヒ

開発中:
- Android 2.2
テストデバイス:
- HTC Desire

4

4 に答える 4

5

正確な精度のために使用する必要があるのは、BigDecimalオブジェクトです。

BigDecimal a = new BigDecimal("3.048");
BigDecimal b = new BigDecimal(1000);

BigDecimal c = a.divide(b);

System.out.println(c); //0.003048
于 2012-05-10T20:52:29.767 に答える
1

正確な浮動小数点計算にはBigDecimalを使用します。スケールを設定すると、出力する範囲を正確に指定できます。

import java.math.BigDecimal;

class Test{

        public static void main(String[] args){
                BigDecimal a = new BigDecimal("3.048");
                BigDecimal b = new BigDecimal(1000);
                BigDecimal c = a.divide(b).setScale(6);
                System.out.println(c); //0.003048
        }
}
于 2012-05-10T20:51:43.467 に答える
1

これはIEEE 754 浮動小数点表現の結果であり、エラーではありません。これに対処するには、結果を適切な精度に丸めます。

于 2012-05-10T20:52:30.667 に答える
0

このような正確な割り当てには BigDecimal を使用します。

ところで、 d の結果は明らかに正しいです。これは、 double には結果を格納できないマシンエンコーディングがあり、正しいと認識されるためです。

于 2012-05-10T20:52:00.563 に答える