3

我正在尝试获取一个带有分数的文本文件。将分数从字符串转换为 bigdecimal。然后将结果划分并存储在堆栈中。

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

我得到了这个错误。

线程“main”中的异常 java.lang.NumberFormatException: Radix out of range at java.math.BigInteger.(Unknown Source) atsorting.separateStrings(sorting.java:60)<---我尝试转换分子的地方到大整数。

在sorting.main(sorting.java:26)<--- 我称之为separateStrings。

它打破的字符串是分子=“9821020392310432153773517114542035029”

我不确定为什么会收到此错误。我的印象是 BigInteger 的长度可以达到 50。另外,它适用于 txt 的第一行,即“8731472450870/1572580584296783758”。

4

2 回答 2

2

利用

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

.. 第二个参数是基数。( JavaDoc )

注意:您可以使用该split("/")方法,它可以为您节省大量低级工作。再看看JavaDoc。了解基本的 Java Api 很好:]

于 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 回答