2014-02-07 2 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입니다. * 꼬리말 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())); 

나는 1.30에 1.295 "최대 절반"와 같은 부분 페니를 반올림하기 위해 인 setScale에되는 RoundingMode를 뒀다 : 여기에 귀하의 코드를 약간 수정이다.

결과는 다음과 같습니다

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으로 초기화하십시오. 부동 소수점 정확도. 그런 다음 소수점 이하 자릿수의 원하는 번호를 설정 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 좋은 ... 나는 그 방법을 몰랐다 ... 항상 새로운 것을 배웠다;) –