我正在尝试使用包含分数的文本文件。将分数从字符串转换为bigdecimal。然后将结果分成并存储在堆栈上。
txt文件中的每一行都是一个分数,它是用char'/'分隔分子和分母随机生成的。分子和分母的长度可以是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超出范围 在java.math.BigInteger。(未知来源) 在sorting.separateStrings(sorting.java:60)&lt; ---正在尝试将分子转换为BigInteger。
在sorting.main(sorting.java:26)&lt; ---我在哪里调用separateStrings。
它破坏的字符串是分子=“9821020392310432153773517114542035029”
我不知道为什么我会收到这个错误。我的印象是BigInteger可以 最长为50.另外,它在txt的第一行工作,即“8731472450870/1572580584296783758”。
答案 0 :(得分:2)
使用
BigDecimal BD2 = new BigDecimal(new BigInteger(denominator, 10));
..第二个参数是基数。 (JavaDoc)
注意:
您可以使用split("/")
方法,它可以为您节省大量的低成本工作。再看一下,JavaDoc。知道基本的Java Api很好:]
答案 1 :(得分:2)
错误是由对象引起的:
new BigInteger(denominator, denominator.length())
试图创建基数为37的BigInteger,正好比允许的最大值36更多。
在这个例子中,你可能不需要设置基数甚至使用BigInteger
,所以你可以简单地使用:
BigDecimal bigDecimal = new BigDecimal(denominator);