Java BigDecimal:如何仅在其';大于某个精度点?

Java BigDecimal:如何仅在其';大于某个精度点?,java,bigdecimal,Java,Bigdecimal,我有一个用例,只有当数字的精度大于某个数字时,我才想设置比例。 换句话说,如果精度为5,我想将scale设置为4,但如果精度小于4,则保持数字不变 这是我期望的结果-> 123.123=>123.123->保留数字原样,因为精度小于4 123.123456=>123.1235->设置刻度,并向上取整 123=>123->保留数字原样,因为精度小于4 0.1234445=>0.1234->比例已设置,并向下舍入 如何使用Java的BigDecimal实现此结果?这些属性有访问方法,您可以直接测试它

我有一个用例,只有当数字的精度大于某个数字时,我才想设置比例。 换句话说,如果精度为5,我想将scale设置为4,但如果精度小于4,则保持数字不变

这是我期望的结果->

123.123
=>
123.123
->保留数字原样,因为精度小于4

123.123456
=>
123.1235
->设置刻度,并向上取整

123
=>
123
->保留数字原样,因为精度小于4

0.1234445
=>
0.1234
->比例已设置,并向下舍入


如何使用Java的BigDecimal实现此结果?

这些属性有访问方法,您可以直接测试它们:

public static void setScaleIfNeeded(BigDecimal bd, int scale, int minPrecision) {
    if (bd.precision() >= minPrecision) {
        bd.setScale(scale);
    }
}

看起来你真正要问的问题是“如何截断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());
    }
}
您现在应该看到,您要做的是查询,然后调整数字的
比例

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));
    }
}

你试过什么吗?您可以使用
ceil
round
函数。我尝试过使用setScale方法。```if(value!=null){//仅当值有十进制值时设置精度。if(value.ulp().compareTo(new BigDecimal(1))<0){value=value.setScale(precision\u SCALE,RoundingMode.HALF\DOWN);}}`
bd.precision()
未给出正确的结果。e、 g.对于
123.123
bd.precision()
产生
6
@pratiksanglikar-它给出了正确的结果。您将“精度”定义为与BigDecimal的作者不同的含义。
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