首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检查BigDecimal的数字数?

如何检查BigDecimal的数字数?
EN

Stack Overflow用户
提问于 2016-03-04 09:38:52
回答 4查看 25.2K关注 0票数 11

在这种情况下,需要检查数字的数目是否小于7位(在DB tried中插入)。我尝试了以下解决方案:

第一种解决办法:

代码语言:javascript
运行
复制
public static void checkNoOfDigitVal(BigDecimal bigDecVal) {
    BigInteger digits = bigDecVal.toBigInteger();
    BigInteger ten = BigInteger.valueOf(10);
    int count = 0;
    do {
        digits = digits.divide(ten);
        count++;
    } while (!digits.equals(BigInteger.ZERO));
    System.out.println("Number of digits : " + count);
}

第一种解决方案有时运行良好,但有时循环中的条件不满足,并不断增加计数数,从而导致无穷尽计数。

第二种解决办法:

代码语言:javascript
运行
复制
public static void checkNoOfDigitsVal(BigDecimal bigDecVal) {
    String string = bigDecVal.toString();
    String[] splitedString = string.split("\\.");
    String[] newVal = splitedString[0].split("");
    int a = newVal.length - 1;
    if (a <= 6) {
        System.out.println("correct size insert into DB: " + a);
    } else {
        System.out.println("Incorrect size insert cancel: " + a);
    }
}

例如,如果值为999999.9999,则第二个解决方案将返回newVal.length = 6

请提出一个更好的解决方案,以检查大小数点的数字数,其中循环开销可以最小化。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-03-04 09:48:40

您可以使用以下几种方式来获得它:

代码语言:javascript
运行
复制
static int integerDigits(BigDecimal n) {
    n = n.stripTrailingZeros();
    return n.precision() - n.scale();
}

精度是数字的总数,标度是小数点右边有多少位,所以差别是小数点左边有多少位。

编辑需要删除任何尾随零以获得正确的结果,例如0.000

可另选地编辑2 (并将其编辑到@AdrianShum),因为尾随零的问题只在0.00...中显示出来,您可以使用:

代码语言:javascript
运行
复制
static int integerDigits(BigDecimal n) {
    return n.signum() == 0 ? 1 : n.precision() - n.scale();
}

http://ideone.com/uI6iMG现场演示

票数 29
EN

Stack Overflow用户

发布于 2016-03-04 09:44:35

中有一个更好的解决方案,就在我的后面(但我现在才看到)。我想我会留下这个,因为有几个人发现它很有用,但是如果我需要这样做,我会使用他们的方法,而不是下面的方法。

您的第二个解决方案非常接近,但它并不一定很复杂:

代码语言:javascript
运行
复制
public static void checkNoOfDigitsVal(BigDecimal bigDecVal) {
    String str = bigDecVal.toString();
    int wholeNumberLength = str.split("\\.")[0].length();
    if (wholeNumberLength <= 6) {
        System.out.println("correct size insert into DB: " + wholeNumberLength);
    } else {
        System.out.println("Incorrect size insert cancel: " + wholeNumberLength);
    }
}

实例化

我假设您的999999.999示例会导致wholeNumberLnegth of 6,因此应该插入到DB中(关于这个问题还不清楚)。

票数 4
EN

Stack Overflow用户

发布于 2019-05-29 08:16:43

因为目前的答案不够有力,国际海事组织,这是我的解决办法。该方法将缩放一个BigDecimal到给定的长度,但只缩放小数部分。如果整数部分将被缩放,它将引发异常。对于我的用例,这是我想要的。按你的喜好调整。

代码语言:javascript
运行
复制
public static BigDecimal scaleBigDecimalToLength(BigDecimal bigDecimal, int length) throws NumbersUtilException {
  int digitCount = bigDecimal.toPlainString().replaceAll("[.,-]", "").length();
  if (digitCount > length) {
      int scale = bigDecimal.scale();
      int newScale = length - (digitCount - scale);
      if (scale > 0 && newScale >= 0) {
          bigDecimal = bigDecimal
                  .setScale(length - (digitCount - scale), RoundingMode.HALF_UP);
      } else {
          throw new NumbersUtilException(
                  String.format("Cannot scale %s to a length of %s", bigDecimal, length));
    }
  }
  return bigDecimal;
}

scaleBigDecimalToLength(BigDecimal.valueOf(0.0000012345600000), 8)输出: 0.0000012

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35792590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档