Java:无论我使用哪种方法,我都不能将double加倍到4位小数

Flo*_*lin 0 java rounding

我需要将一些双打舍入到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);
Run Code Online (Sandbox Code Playgroud)

有没有人有我正在寻找的神奇解决方案:)?

谢谢 !

注意:这是完整的代码:

// 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))));
Run Code Online (Sandbox Code Playgroud)

Dav*_*der 5

如果要存储结果double类型(您的第一个例子暗示你),然后会出现这种情况.Double不能存储一些数字.

舍入后,将结果存储在a BigDecimal或a中String.

更新 - 请参阅下面的评论

可能误解了你的评论,但是这样的话.

// this.totalTime += (1.0/someInteger)*myValue

BigDecimal ratio = BigDecimal.ONE.divide(new BigDecimal(someInteger));
totalTime = totalTime.add(ratio.multiply(myValue));