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

时间:2013-02-14 14:07:28

标签: 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);

有没有人有我想要的神奇解决方案:)?

谢谢!

注意: 这是完整的代码:

// 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))));

5 个答案:

答案 0 :(得分:5)

如果您将结果返回存储到double类型(您的第一个示例提示),则会发生这种情况。 Double不能存储一些数字。

完成舍入后,将结果存储在BigDecimalString中。

已更新 - 请参阅以下评论

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

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

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

答案 1 :(得分:1)

double val = 2.33333333;
DecimalFormat df2 = new DecimalFormat("###.####");

试试这个。

答案 2 :(得分:1)

由于浮点表示的限制,double不能代表所有可能的十进制值(有关详细信息,请参阅http://en.wikipedia.org/wiki/Floating_point或只是google“浮动ponint精度问题”)。因此,如果您需要处理舍入值,只需将它们存储在BigDecimal中,然后对其进行舍入并继续使用它而不是返回到双精度值。

答案 3 :(得分:0)

这是我到目前为止所知道的...要围绕一个双倍你应该像这样使用BigDecimal:

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

结果将是:0.123

请注意,“scale”是您在该点之后想要拥有的位数。 希望这会有所帮助。

答案 4 :(得分:0)

我不确定你在寻找什么,我会做这样的计算

double p=36371.922099999996;

p=Math.round(p *10000.0000)/10000.0000;

System.out.println(p);

我得到了36371.9221

试试吧