我需要将一些双打舍入到3到4位小数。我尝试了3种不同的方法,但都没有。
对于我所拥有的大部分双倍,它都有效,但无论如何我仍然有这样的双打:
到目前为止,我尝试了以下方法:
-- 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))));
答案 0 :(得分:5)
如果您将结果返回存储到double
类型(您的第一个示例提示),则会发生这种情况。 Double不能存储一些数字。
完成舍入后,将结果存储在BigDecimal
或String
中。
已更新 - 请参阅以下评论
可能误解了你的评论,但是这样的话。
// 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
试试吧