2014-02-07 192 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尼斯...我不知道这种方法...总是学习新的东西;) –