Java BigDecimal:如何仅在精度点大于某个特定值时设置比例?

3
我有一个使用场景,只有当数字的精度大于某个数字时,我才想设置规模。 换句话说,如果精度小于4,则将比例设置为4,但如果精度小于4,则将数字保持不变。
以下是期望的结果 -> 123.123 => 123.123 -> 因为精度小于4,所以数字保持不变。 123.123456 => 123.1235 -> 设置了比例,并向上舍入。 123 => 123 -> 因为精度小于4,所以数字保持不变。 0.1234445 => 0.1234 -> 设置了比例并向下舍入。
如何使用Java的BigDecimal实现此结果?

1
你试过什么吗?你可以使用 ceilround 函数。 - user11255515
1
我已经尝试使用setScale方法。 - Pratik
if (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
2个回答

7

看起来你真正想问的问题是“如何截断BigDecimal的小数部分,使其小数点右侧最多有4个数字?”

首先,我认为你应该确保理解与BigDecimal相关的scaleprecision的含义。

如果你运行以下小程序:

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

0

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

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

bd.precision() 不会给出正确的结果。例如,对于 123.123bd.precision() 的结果为 6 - Pratik
2
@pratiksanglikar - 它给出了正确的结果。您将“精度”定义为与BigDecimal的作者不同的含义。 - dan.m was user2321368

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接