【问题标题】:Java BigDecimal: How to set scale only if it's greater than certain precision point?Java BigDecimal:仅当它大于某个精度点时如何设置比例?
【发布时间】:2019-09-24 09:25:52
【问题描述】:

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

这是我期待的结果 ->

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

123.123456 => 123.1235 -> 设置比例,并向上取整。

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

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

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

【问题讨论】:

  • 你尝试过什么吗?你可以使用ceilround 函数..
  • 我尝试过使用 setScale 方法。
  • ``` if (value != null) { // 仅当值具有十进制值时才设置精度。 if (value.ulp().compareTo(new BigDecimal(1))

标签: java bigdecimal


【解决方案1】:

您真正要问的问题似乎是“如何截断 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • bd.precision() 没有给出正确的结果。例如对于123.123bd.precision() 结果为6
    • @pratiksanglikar - 它给出了正确的结果。您将“精度”定义为与 BigDecimal 的作者所做的不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2012-09-05
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多