2016-03-04 88 views
0

要求檢查數字的位數是否小於7位,在這種情況下插入數據庫否則不要。我曾嘗試以下解決方案:如何檢查BigDecimal中的位數?

解決方案一:

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); 
} 

首先解決工作正常,但有時有時while循環不滿足條件,並將不斷增加,導致無休止的計數計數。

第二溶液:

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

請建議一個更好的解決方案來檢查循環開銷可以最小化的十進制數的位數。

+0

如果會發生什麼你做這個? while(!digits.compareTo(BigInteger.ZERO)!= 0);'。 –

+0

*「第二個解決方案將返回newVal.length = 7,而不是它應該是6,這是不正確的」* Huh? 6是否正確? –

+0

可能的重複http://stackoverflow.com/questions/2296110/determine-number-of-decimal-place-using-bigdecimal – KERiii

回答

10

你可以平凡用得到它:

static int integerDigits(BigDecimal n) { 
    n = n.stripTrailingZeros(); 
    return n.precision() - n.scale(); 
} 

精度是數字的總數,規模有多少是小數點右邊,這樣的差別是多少都是左邊的的小數點。

編輯有必要除去任何尾隨零以得到正確的結果。 0.000

EDIT 2或者(和的ACK到@AdrianShum),因爲具有尾隨零的問題只與0.00...表現,你可以使用:

static int integerDigits(BigDecimal n) { 
    return n.signum() == 0 ? 1 : n.precision() - n.scale(); 
} 

現場演示在http://ideone.com/uI6iMG

+0

我寧願簡單地做一個'return(n.signum()== 0)? 1:(n.precision() - n。scale());'爲了避免額外的工作和臨時對象剝離零 –

+0

@AdrianShum是的,這也可以:)它似乎只是0.00 ...導致問題與'.scale()'和尾隨零。 – Alnitak

+0

感謝@Alnitak提供了很好的答案。你的一段代碼減少了代碼行,看起來效率很高。布拉沃! – Harleen

0

你的第二個解決方案是接近,但它並沒有相當那麼複雜:

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); 
    } 
} 

Live Example

我假設你999999.999例子應該導致6,因此wholeNumberLnegth插入數據庫(問題不清楚)。