2012-09-28 1 views
3

분수가있는 텍스트 파일을 가져 오려고합니다. 문자열에서 분수를 bigdecimal로 변환하십시오. 그런 다음 스택에 결과를 나누어 저장하십시오.스레드 "main"의 예외 java.lang.NumberFormatException : 범위 밖의 기수

txt 파일의 각 줄은 분자와 분모를 구분하는 문자 '/'로 임의로 생성 된 하나의 분수입니다. 분자와 분모는 길이가 1-50이고 0보다 커야합니다. 숫자는 임의로 생성되어 소수 자리를 저장할 필요가 있습니다. 내 코드에서 먼저 문자열을 BigInteger로 변환 한 다음 BigDecimal로 변환합니다. 이것은 첫 번째 문자열에 대해서는 작동하지만 두 번째 문자열의 분자에서는 중단됩니다.

public static void main(String[] args) throws FileNotFoundException { 
    File file = new File("C:/Users/eric/workspace/sortProj/src/data.txt"); 

    FileReader fr = new FileReader(file); 
    Scanner scanner = new Scanner(fr); 
    Stack<BigDecimal> pile = new Stack<BigDecimal>(); 
    String numerator = ""; 
    String denominator = ""; 

    while (scanner.hasNextLine()) { 
     String str = scanner.nextLine(); 
     numerator = ""; 
     denominator = ""; 

     separateStrings(pile, numerator, denominator, str); 
    } 
} 


// appends chars to numerator string until it hits '/' then appends chars to 
// denominator string 
public static void separateStrings(Stack<BigDecimal> stack, 
     String numerator, String denominator, String source) { 
    boolean isNumerator = true; 
    for (int i = 0; i < source.length(); i++) { 
     if (source.charAt(i) == '/') { 
      isNumerator = false; 

     } 
     else if (isNumerator == true) { 
      numerator += source.charAt(i);   
     }else{ 
      denominator += source.charAt(i); 
     } 
    } 
      //converts and stores fractions. 

    BigDecimal BD2 = new BigDecimal(new BigInteger(denominator, denominator.length())); 
    BigDecimal BD1 = new BigDecimal(new BigInteger(numerator, numerator.length())); 
    stack.push(BD1.divide(BD2, 20, BigDecimal.ROUND_FLOOR)); 
} 

이 오류가 발생했습니다. "주"java.lang.NumberFormatException의 스레드에서

예외 :. 기수 범위 중 java.math.BigInteger의에서 (알 수없는 소스) sorting.separateStrings에서 (sorting.java:60) < --- 인 분자를 BigInteger로 변환하려고합니다.

at sorting.main (sorting.java:26) < --- 여기서 separateStrings를 호출합니다.

가에 파산하는 문자열

는 분자했다 = "9821020392310432153773517114542035029"

내가이 오류를 받고 있어요 이유를 모르겠어요. 나는 BigInteger가 길이 50까지 일 수 있다는 인상 아래에있었습니다. 게다가, 그것은 "8731472450870/1572580584296783758"이었던 txt의 첫 번째 줄에서 작업했습니다.

BigDecimal BD2 = new BigDecimal(new BigInteger(denominator, 10)); 

.. 제 PARAM

답변

2

: 시도

new BigInteger(denominator, denominator.length()) 

는, 37의 기수로 (36)의 허용 된 최대 값보다 정확히 1 이상을 BigInteger을 만들 수는 기본 자바 API를 알고하는 것이 좋다 .

이 예에서

당신은 아마 기수를 설정하거나 BigInteger를 사용할 필요가 없었다, 그래서 당신은 간단하게 사용할 수 있습니다

BigDecimal bigDecimal = new BigDecimal(denominator); 
2

사용 기수이다. (JavaDoc)

참고 : split("/") 메서드를 사용하면 많은 저음 작업을 줄일 수 있습니다. 다시 봐, JavaDoc. ] 오류는 객체에 의해 발생

+0

감사 팁을위한 – Boid