Java : No matter which method I use, 我无法将 double 四舍五入到小数点后 4 位

标签 java rounding

我需要将一些 double 四舍五入到小数点后 3 到 4 位。我尝试了 3 种不同的方法,但都不起作用。

对于我拥有的大多数 double 来说,它都有效,但无论如何我仍然拥有这样的 double :

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

最佳答案

如果您将结果返回存储为double类型(您的第一个示例暗示您是这样),那么就会发生这种情况。 Double 无法存储某些数字。

四舍五入后,将结果存储在 BigDecimalString 中。

已更新 - 请参阅下面的评论

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

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

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

关于Java : No matter which method I use, 我无法将 double 四舍五入到小数点后 4 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14876648/

相关文章:

java - 如何阻止 Java 应用程序在数据库中插入相同的值 - SQL Server

java - 找出两棵树是否有相似的叶子(从左到右)?

c++ - 为什么 sprintf_s 在不同版本的 Visual Studio 中给出不同的结果?

google-sheets - Google 表格小于或等于 (<=) 提供错误结果

r - 如何在 R 中舍入到 0.25 或 0.75,而不是 0.00 或 0.50?

java - 如何使用 JNA 遍历窗口元素?

java - 如何在 android SQLite 中的现有表上添加列?

JavaFX - 如何同步CustomTab(扩展Tab)和TabPane

python - float 格式为 3 或 4 位小数

java - 将 double 格式设置为 2 位小数不起作用