3

分数のあるテキストファイルを取得しようとしています。分数を文字列からbigdecimalに変換します。次に、結果を分割してスタックに保存します。

txtファイルの各行は、分子と分母を区切る文字「/」でランダムに生成された1つの分数です。分子と分母の長さは1〜50で、0より大きくする必要があります。数値はランダムに生成されるため、小数点以下の桁数を格納する必要があります。私のコードでは、最初に文字列をBigIntegerに変換し、次にBigDecimalに変換します。これは最初の文字列に対しては機能しますが、2番目の文字列の分子では機能しません。

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

このエラーが発生しました。

スレッド"main"の例外java.lang.NumberFormatException:基数がjava.math.BigInteger。(不明なソース)のsorting.separateStrings(sorting.java:60)で範囲外です<---分子を変換しようとしている場所ですBigIntegerに。

sort.main(sorting.java:26)<---ここでseparateStringsを呼び出します。

それが壊れた文字列は分子="9821020392310432153773517114542035029"でした

なぜこのエラーが発生するのかわかりません。BigIntegerの長さは最大50であるという印象を受けました。さらに、txtの最初の行である「8731472450870/1572580584296783758」で機能しました。

4

2 に答える 2

2

使用する

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

..2番目のパラメータは基数です。(JavaDoc

注:このsplit("/")方法を使用すると、低レベルの作業を大幅に節約できます。もう一度、JavaDocを見てください。基本的なJavaAPIを知っておくとよいでしょう:]

于 2012-09-28T23:33:49.023 に答える
2

エラーの原因は次のとおりです。

new BigInteger(denominator, denominator.length())

これは、基数が37のBigIntegerを作成しようとしています。これは、許可されている最大値の36よりも正確に1大きい値です。

この例では、おそらく基数を設定したり、を使用したりする必要はなかったBigIntegerので、次のように使用できます。

BigDecimal bigDecimal = new BigDecimal(denominator);
于 2012-09-28T23:35:01.673 に答える