在这种情况下,需要检查数字的数目是否小于7位(在DB tried中插入)。我尝试了以下解决方案:
第一种解决办法:
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);
}第一种解决方案有时运行良好,但有时循环中的条件不满足,并不断增加计数数,从而导致无穷尽计数。
第二种解决办法:
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。
请提出一个更好的解决方案,以检查大小数点的数字数,其中循环开销可以最小化。
发布于 2016-03-04 09:48:40
您可以使用以下几种方式来获得它:
static int integerDigits(BigDecimal n) {
n = n.stripTrailingZeros();
return n.precision() - n.scale();
}精度是数字的总数,标度是小数点右边有多少位,所以差别是小数点左边有多少位。
编辑需要删除任何尾随零以获得正确的结果,例如0.000
可另选地编辑2 (并将其编辑到@AdrianShum),因为尾随零的问题只在0.00...中显示出来,您可以使用:
static int integerDigits(BigDecimal n) {
return n.signum() == 0 ? 1 : n.precision() - n.scale();
}http://ideone.com/uI6iMG现场演示
发布于 2016-03-04 09:44:35
在中有一个更好的解决方案,就在我的后面(但我现在才看到)。我想我会留下这个,因为有几个人发现它很有用,但是如果我需要这样做,我会使用他们的方法,而不是下面的方法。
您的第二个解决方案非常接近,但它并不一定很复杂:
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中(关于这个问题还不清楚)。
发布于 2019-05-29 08:16:43
因为目前的答案不够有力,国际海事组织,这是我的解决办法。该方法将缩放一个BigDecimal到给定的长度,但只缩放小数部分。如果整数部分将被缩放,它将引发异常。对于我的用例,这是我想要的。按你的喜好调整。
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
https://stackoverflow.com/questions/35792590
复制相似问题