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

5

如果您将结果存储一个double类型(您的第一个示例暗示您是),那么这将发生。Double 不能存储一些数字。

舍入后,将结果存储在 aBigDecimal或 aString中。

更新 - 请参阅下面的评论

可能误解了您的评论,但类似这样。

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

BigDecimal 比率 = BigDecimal.ONE.divide(new BigDecimal(someInteger));
totalTime = totalTime.add(ratio.multiply(myValue));
于 2013-02-14T14:16:12.597 回答
1
double val = 2.33333333;
DecimalFormat df2 = new DecimalFormat("###.####");

试试这个。

于 2013-02-14T14:11:04.423 回答
1

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

于 2013-02-14T14:21:16.083 回答
0

到目前为止,这是我所知道的...要舍入双精度,您应该像这样使用 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 回答
0

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

double p=36371.922099999996;

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

System.out.println(p);

我得到 36371.9221

尝试一下

于 2013-10-27T05:56:28.107 回答