Java BigDecimal:仅在大于特定精度点时才设置刻度?

时间:2019-05-06 18:10:12

标签: java bigdecimal

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

这是我期望的预期结果->

123.123 => 123.123->保持数字不变,因为精度小于4。

123.123456 => 123.1235->设置比例并四舍五入。

123 => 123->保持数字不变,因为精度小于4。

0.1234445 => 0.1234->设置比例并向下取整。

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

2 个答案:

答案 0 :(得分:4)

您似乎真正要问的问题是“我如何截断BigDecimal的小数部分,以便它在小数点右边最多有4个数字?”

首先,我认为您应该确保您了解scaleprecisionBigDecimal的含义。

如果运行此小程序:

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

答案 1 :(得分:0)

这些属性具有访问方法,您可以直接对其进行测试:

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