看起来你真正想问的问题是“如何截断BigDecimal的小数部分,使其小数点右侧最多有4个数字?”
首先,我认为你应该确保理解与BigDecimal
相关的scale
和precision
的含义。
如果你运行以下小程序:
public static void main(String[] args) {
List<BigDecimal> decimals = new LinkedList<>();
decimals.add( new BigDecimal(".123456"));
decimals.add( new BigDecimal("1.23456"));
decimals.add( new BigDecimal("12.3456"));
decimals.add( new BigDecimal("123.456"));
decimals.add( new BigDecimal("1234.56"));
decimals.add( new BigDecimal("12345.6"));
decimals.add( new BigDecimal("123456"));
for(BigDecimal bd : decimals){
System.out.println(bd.toPlainString() + ". scale = " + bd.scale() + ", precision = " + bd.precision());
}
}
你将会看到以下输出结果:
0.123456. scale = 6, precision = 6
1.23456. scale = 5, precision = 6
12.3456. scale = 4, precision = 6
123.456. scale = 3, precision = 6
1234.56. scale = 2, precision = 6
12345.6. scale = 1, precision = 6
123456. scale = 0, precision = 6
现在你应该明白要做的是查询并调整数字的 scale
。
static BigDecimal doIt(BigDecimal input){
if(input.scale() > 4){
return input.setScale(4, RoundingMode.HALF_DOWN);
}
else{
return input;
}
}
一个简单的测试程序演示输出结果与您所请求的相同。
public static void main(String[] args) {
List<BigDecimal> decimals = new LinkedList<>();
decimals.add(new BigDecimal("123.123"));
decimals.add(new BigDecimal("123.123456"));
decimals.add(new BigDecimal("123"));
decimals.add(new BigDecimal("0.1234445"));
for (BigDecimal bd : decimals) {
System.out.println(bd.toPlainString() + " ---> " + doIt(bd));
}
}
输出
123.123 ---> 123.123
123.123456 ---> 123.1235
123 ---> 123
0.1234445 ---> 0.1234
ceil
和round
函数。 - user11255515if (value != null) { // set the precision only if the value has decimal value. if (value.ulp().compareTo(new BigDecimal(1)) < 0) { value = value.setScale(PRECISION_SCALE, RoundingMode.HALF_DOWN); } }
- Pratik