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 .round()或.setScale()?如何执行此操作?您可以使用setScale()将小数位数减少为零。假设value保留要舍入的值: BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP); System.out.println(value + " -
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
或.setScale()
?如何执行此操作?您可以使用setScale()
将小数位数减少为零。假设value
保留要舍入的值:
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
ArrayList list=new ArrayList();
添加(新的大十进制(“100.12”);
添加(新的大十进制(“100.44”);
添加(新的大十进制(“100.50”);
添加(新的大十进制(“100.75”);
用于(BigDecimal bd:list){
System.out.println(bd+“->”+bd.setScale(0,舍入模式。半向上)。setScale(2));
}
输出:
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
)
);
}
测试代码:
List<BigDecimal> bigDecimals =
Arrays.asList(new BigDecimal("100.12"),
new BigDecimal("100.44"),
new BigDecimal("100.50"),
new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
System.out.println(roundBigDecimal(bd).toPlainString());
}
列出大小数=
Arrays.asList(新的BigDecimal(“100.12”),
新的BigDecimal(“100.44”),
新的BigDecimal(“100.50”),
新的大十进制(“100.75”);
for(最终大小数bd:bigDecimals){
System.out.println(roundBigDecimal(bd.toPlainString());
}
输出:
List<BigDecimal> bigDecimals =
Arrays.asList(new BigDecimal("100.12"),
new BigDecimal("100.44"),
new BigDecimal("100.50"),
new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
System.out.println(roundBigDecimal(bd).toPlainString());
}
100100
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不,设置小数点后返回的新小数点与第一个小数点不同。例如:
BigDecimal bd1=新的BigDecimal(100.12);BigDecimal bd2=bd1.setScale(0,舍入模式,向上舍入一半);System.out.println(bd1.equals(bd2))代码>打印false@Daniel:我在回答中发布的代码片段中已经暗示了这一点。我现在已经明确说明了。RoundingMode
这是什么?它是BigDecimal
这没有任何作用。从round
的文档中可以看出:“如果精度设置为0,则不会进行舍入。”我对第一个结果“不是我想要的…”的说法感到好奇。如果您确实关心输出格式,则可以使用DecimalFormat
(如new DecimalFormat(“####.00”)
)来管理将BigDecimal
转换回字符串的过程。它给出了@Grodriquez代码段和您创建的两个值的结果“101.00”
。第二次在这里取整是不必要的,因为您知道您已经有一个整数了,所以我会使用bigdecime.ROUND\u,这在我看来是不必要的,更清楚一点。不要认可这个解决方案或任何东西,但是input.tobiginger().toString().length()
部分使用对数会更有效率,比如round_up(log(input))+(如果输入是十的幂,则为1,否则为0)