当前位置: 首页 > 知识库问答 >
问题:

JavaBigDecimal:如何设置规模只有当它是大于一定的精度点?

龙佐
2023-03-14

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

这是我期待的预期结果-

123.123=

123.123456=

123=

0.1234445=

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


共有2个答案

宋华美
2023-03-14

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

public static void setScaleIfNeeded(BigDecimal bd, int scale, int minPrecision) {
    if (bd.precision() >= minPrecision) {
        bd.setScale(scale);
    }
}
沙靖琪
2023-03-14

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

首先,我认为您应该确保了解比例精度对于BigDecimal的含义。

如果你运行这个小程序:

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

现在您应该看到,您要做的是查询并调整数字的比例。

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
 类似资料:
  • 问题内容: 我试图确定双精度的最大精度是多少。在此链接的可接受答案的注释中,Java中的double保持精度 @PeterLawrey将max precision设置为15。 您如何确定呢? 问题答案: @PeterLawrey表示最大精度为15。 实际上,这根本不是他所说的。他说的是: 双精度有15个小数位 他错了。它们的精度为15个十进制 数字 。 任何数字中的小数位数由其对数10的对数给出。

  • 我试图确定double的最大精度是多少。在这个链接中接受的答案的注释中,Java中的Retain precision with double@PeterLawrey声明max precision In 15。 你如何确定这一点?

  • 我在应用程序中使用BigDecimal 作为我的数字,例如,使用 JPA。我对术语“精度”和“规模”进行了一些研究,但我不明白它们到底是什么。 有人能解释一下BigDecimal值的“精度”和“刻度”的含义吗? 谢谢!

  • 问题内容: 我有一个XSD,要求我对经纬度使用BigDecimal。目前,我将经度/纬度作为双精度值,并将其转换为BigDecimal,但仅需要使用12个精度位即可。我还无法弄清楚该如何设置。谁能帮我这个? 问题答案: 问题的标题询问精度。BigDecimal区分小数位数和精度。小数位数是小数位数。您可以将精度视为有效数字的数量,也称为有效数字。 Clojure中的一些示例。 (在Clojure中

  • 我想把我的十进制修剪成像8.063这样的东西,而不是原来的E-98.0638304611694。我已经为它实现了一个函数,但是当它里面有时,它就不起作用了。我应该修改哪一部分?? 编辑 当我尝试调用函数时,当前实现给了我。

  • 我有一个使用GCS存储文件来上传文件的案例。我想通过使用代和前提条件()来避免竞争条件。 文件中有关于如何做到这一点的解释。 但是,我使用的是Java API,文档只显示了JSON/XML API。