我需要将一些 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 无法存储某些数字。
四舍五入后,将结果存储在 BigDecimal
或 String
中。
已更新 - 请参阅下面的评论
可能误解了您的评论,但类似这样。
// 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/