Java BigDecimal:四舍五入到最接近的整数值
我需要以下结果Java BigDecimal:四舍五入到最接近的整数值,java,rounding,bigdecimal,Java,Rounding,Bigdecimal,我需要以下结果 100.12 -> 100.00 100.44 -> 100.00 100.50 -> 101.00 100.75 -> 101.00 .圆形还是.固定刻度?如何执行此操作?您可以使用setScale将小数位数减少到零。假设值保留要舍入的值: BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP); System.out.println(value + " -> " + scaled)
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.圆形还是.固定刻度?如何执行此操作?您可以使用setScale将小数位数减少到零。假设值保留要舍入的值:
BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);
使用round有点复杂,因为它需要您指定要保留的位数。在您的示例中,这将是3,但并非对所有值都有效:
BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);
请注意,BigDecimal对象是不可变的;setScale和round都将返回一个新对象。我不认为您可以在一个命令中对其进行那样的舍入。试一试
ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
list.add(new BigDecimal("100.12"));
list.add(new BigDecimal("100.44"));
list.add(new BigDecimal("100.50"));
list.add(new BigDecimal("100.75"));
for (BigDecimal bd : list){
System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2));
}
Output:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
我测试了您剩下的示例,它返回了想要的值,但我不能保证它的正确性。这里有一个非常复杂的解决方案,但它可以工作:
public static BigDecimal roundBigDecimal(final BigDecimal input){
return input.round(
new MathContext(
input.toBigInteger().toString().length(),
RoundingMode.HALF_UP
)
);
}
测试代码:
输出:
一百
100
101
101
你想要
round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP
简单看一下:
以及:
或者如果使用Java6,那么
以及:
setScale(int precision, RoundingMode mode);
round(MathContext mc);
如果我接受格罗德里格斯的回答
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
这是输出
100.23 -> 100
100.77 -> 101
这不是我想要的,所以我最终做了这个
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
这就是我得到的
100.23 -> 100.00
100.77 -> 101.00
这就解决了我目前的问题..:
谢谢大家。它不起作用:100.12:100.12100.44:100.44100.50:100.5100.75:100.75不,设置小数点后返回的新小数点与第一个小数点不同。例如:BigDecimalBD1=新的BigDecimal100.12;BigDecimal bd2=bd1.setScale0,舍入模式.HALF_向上;System.out.printlnbd1.equalsbd2;印刷品false@Daniel:我在回答中发布的代码片段中已经暗示了这一点。我现在已经说得很清楚了。RoundingMode那是什么?这很重要,他什么都不做。根据round的文档:如果精度设置为0,则不会进行取整。我很好奇第一个结果不是我想要的。。。。如果您确实关心输出格式,可以使用DecimalFormat,如new DecimalFormat.00中所述,来管理将BigDecimal转换回字符串的过程。对于@Grodriquez代码段和您创建的两个值,结果都是101.00。第二次在这里取整是不必要的,因为您知道您已经有一个整数了,所以我会使用BigDecimal.ROUND_,这在我看来是不必要的,更清楚一点。我不赞同这个解决方案或任何东西,但是input.toBigInteger.toString.length部分使用对数会更有效,如果input是十的幂,则类似于round_uploginput+1,否则为0
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
100.23 -> 100.00
100.77 -> 101.00