0

一部の倍精度浮動小数点数を 3 ~ 4 桁に丸める必要があります。3つの異なる方法を試しましたが、どれもうまくいきません。

私が持っているダブルのほとんどは機能しますが、とにかくそのようなダブルを持ち続けます:

  • 0.12919999999999998
  • 0.12365000000000001
  • 36371.922099999996

これまでに次の方法を試しました:

-- 1
(double) Math.round(someDouble * 10000) / 10000

-- 2
DecimalFormat twoDForm = new DecimalFormat("0.0000");
twoDForm.format(someDouble);

-- 3
BigDecimal bd = new BigDecimal(someDouble);
bd = bd.setScale(4, BigDecimal.ROUND_HALF_UP);

私が探している魔法のソリューションを持っている人はいますか :) ?

ありがとうございました !

注:完全なコードは次のとおりです。

// Processing
        long start = System.nanoTime();

        for (int i = 0; i < loopSize; i++) {
            process();
        }
        // end timer
        long absTime = System.nanoTime() - start;
        double absTimeMilli = absTime * 1e-6;


        DecimalFormat t = new DecimalFormat("###.####");

        context.setTotalTime(Double.valueOf(t.format(absTimeMilli)));
        context.setUnit(TimeUnit.SECONDS);
        context.setMeanTime(Double.valueOf(t.format(absTimeMilli / Const.BENCH_LOOP_COUNT)));
        context.setExecPerTimeUnit(Double.valueOf(t.format(loopSize / (absTimeMilli*1e-3))));
4

5 に答える 5

1

double は、浮動小数点表現の制限により、可能なすべての 10 進数値を表すことはできません (詳細についてはhttp://en.wikipedia.org/wiki/Floating_pointを参照するか、「浮動小数点の精度の問題」をグーグルで検索してください)。したがって、丸められた値を処理する必要がある場合は、単純にそれらを BigDecimal に格納し、丸めて、double に戻す代わりにそれを処理し続けます。

于 2013-02-14T14:21:16.083 に答える
0

これが私がこれまでに知っていることです... double を丸めるには、次のように BigDecimal を使用する必要があります。

double yourDouble = 0.123456789;
int scale = 3;
double yourRoundedDouble = new BigDecimal(yourDouble).setScale(scale, RoundingMode.HALF_UP).doubleValue();

結果は次のようになります0.123

「スケール」は、ポイントの後に必要な桁数であることに注意してください。お役に立てれば。

于 2013-04-30T11:47:17.220 に答える