4

Java プログラムで必要な関数に少し問題がありました。「double」変数の合計桁数を確認したい。(例: 5 は 1 を返し、5.0034 は 5 を返し、2.04 は 3 を返す必要があります。) 私の関数は次のとおりです。

private int getDoubleLength (double a) {
        int len = 0;
        while (a != (int) a) {
            a *= 10;
        }
        while (a > 1) {
            len ++;
            a/=10;
        }
        System.out.println(String.format("Double %f has %d digits.",a,len));
        return len;
    }

これで完璧に動作しますが、数学的計算を行っていると、わずかに double のエラーが発生します。10 を cos(60) で割ると、0.5 になります。答えは 20.0 のはずですが、プログラムは 20.000000000000004 を返します (その番号をコピーしました)。while ループが動かなくなり、プログラムがハングします。

何か案は?(または、数字の桁をチェックするための他の優れたソリューション!)

4

4 に答える 4

3

double と float およびその操作は正確ではないため、代数計算と比較して常にわずかなエラーが発生します。コサインなどを使用している場合は、数値解析に関する本や Web テキストで説明されているこれらの丸め誤差に常に対処する必要があります。単純な算術演算を使用している場合は、java.lang.BigDecimalを見てください。

浮動小数点値の格納方法の詳細については、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを参照してください。

于 2011-05-13T14:15:41.050 に答える
1

これは、私が実装した方法です。 double が指数表現で大きな返された文字列だったときに、文字列に単純に変換します。つまり、20000000 は 2.0E+7 を返し、分割はここからそれを分割し、間違ったカウントになります。私は以前は方法を使っていBigDecimalましtoPlainString()

protected int countDecimalDigits(Double d) {
    BigDecimal deci = BigDecimal.valueOf(d);
    int integerPlaces = 0;
    int decimalPlaces = 0;
    String text = deci.toPlainString();

    String[] integerDecimalSplit = text.split("\\.");
    if (null != integerDecimalSplit[0]) {
        integerPlaces = integerDecimalSplit[0].length();
    }
    if (integerDecimalSplit.length > 1) {
        decimalPlaces = integerDecimalSplit[1].length();
    }
    return integerPlaces + decimalPlaces;
}
于 2015-04-20T03:46:37.613 に答える
1

toString().length() は
、「.」を減算することを覚えて解決する必要があります。それがそこにあり、カウントされるべきではない場合

于 2011-05-13T14:14:00.000 に答える
0

丸めの問題です。私は文字列を使用し、文字を数え、どの数字を重要視するかを決定します。

于 2011-05-13T14:26:15.513 に答える