2014-02-07 191 views
6

我想從java中的bigdecimal中提取整數部分和小數部分。從Java中的Bigdecimal中提取整數和小數部分

我正在使用下面的代碼。

BigDecimal bd = BigDecimal.valueOf(-1.30) 
    String textBD = bd.toPlainString(); 
    System.out.println("length = "+textBD.length()); 
    int radixLoc = textBD.indexOf('.'); 
    System.out.println("Fraction "+textBD.substring(0,radixLoc)+"Cents: " + textBD.substring(radixLoc + 1, textBD.length())); 

我得到的輸出作爲

-1和3

,但我想尾隨零也從-1.30

輸出應該-1和30

+1

你知道'-1.3 == -1.30'因此不需要保存第二個小數,這就是爲什麼你不明白這一點。您需要使用數字格式,而不是toPlainString()。 –

+0

前導== 0。你想*尾隨*零。 –

回答

4

的-1.30浮點表示並不確切。這裏是你的代碼稍加修改:

BigDecimal bd = new BigDecimal("-1.30").setScale(2, RoundingMode.HALF_UP); 
String textBD = bd.toPlainString(); 
System.out.println("text version, length = <" + textBD + ">, " + textBD.length()); 
int radixLoc = textBD.indexOf('.'); 
System.out.println("Fraction " + textBD.substring(0, radixLoc) 
    + ". Cents: " + textBD.substring(radixLoc + 1, textBD.length())); 

我已經把的RoundingMode上setScale圓小數便士喜歡1.295「半升」至1.30。

的結果是:

text version, length = <-1.30>, 5 
Fraction -1. Cents: 30 
+0

這將不會從1.25到1.30。然而,它將會環繞1.295至1.3。 – GriffeyDog

+0

對,你是GriffeyDog。謝謝。編輯我的答案。 – rajah9

1

String初始化以避免問題h浮點精度。然後使用setScale設置小數點後的對方號碼:

BigDecimal bd = new BigDecimal("-1.30").setScale(2); 
String textBD = bd.toPlainString(); 
System.out.println("length = "+textBD.length()); 
int radixLoc = textBD.indexOf('.'); 
System.out.println("Fraction "+textBD.substring(0,radixLoc)+"Cents: " + textBD.substring(radixLoc + 1, textBD.length())); 
3

如果你喜歡不涉足與絃樂(我認爲這不是很好的做法 - 除創建德BigDecimal的一部分),你可以只用數學做到這一點:

// [1] Creating and rounding (just like GriffeyDog suggested) so you can sure scale are 2 
BigDecimal bd = new BigDecimal("-1.30").setScale(2, RoundingMode.HALF_UP); 

// [2] Fraction part (0.30) 
BigDecimal fraction = bd.remainder(BigDecimal.ONE); 

// [3] Fraction as integer - move the decimal. 
BigDecimal fraction2 = fraction.movePointRight(bd.scale()); 

// [4] And the Integer part can result of: 
BigDecimal natural = bd.subtract(fraction); 

// [5] Since the fraction part of 'natural' is just Zeros, you can setScale(0) without worry about rounding 
natural = natural.setScale(0); 

我知道,我的英語很糟糕。如果你能理解我想說的話,請隨時糾正。謝謝。

+0

@denov尼斯...我不知道這種方法...總是學習新的東西;) –