所以,我正在尝试编写一个计算表达式的程序,例如“3+(6/5)+(2 * 3/7) 7/2 (9/4 + 4 * 1)=“,其中优先顺序与写入顺序相同。唯一重要的是,如果括号内存在子表达式,则应首先计算它们。
我的代码在某种程度上是可以的,但最终的结果并非如此。例如“3+(6/5)+(2 * 3/7) 7/2 (9/4 + 4 * 1)=”应打印110.63,但打印110.69。 “4 + 6/5 +(4 * 9-8)/ 7 * 2 =”打印8.58,但应为8.57。 我几乎可以肯定它与舍入有关但我不太确定并且无法想到解决方案,因为我对BigDecimal甚至是一般的编程都很新。
PS:它可以正常使用双打但我在某个平台上运行未知测试时会收到运行时错误进行测试,所以我想我会尝试使用BigDecimal,因为小数点后面的数字太多但是哦,好吧..继承我的代码:
String nc = scan.nextLine();
BigDecimal j = new BigDecimal(0);
for (int i = 0; i < nc.length(); i++) {
if (nc.charAt(i) == '(') {
int startIndex = nc.indexOf("(");
int endIndex = nc.indexOf(")");
String toBeReplaced = nc.substring(startIndex, endIndex + 1);
String omg = toBeReplaced.replaceAll("\\(|\\)", "");
BigDecimal ok = new BigDecimal(0);
int m=0;
String split[]=omg.split("\\+|\\-|\\*|\\/|\\=");
for (int k = 0; k < omg.length(); k++) {
if (k == 0) {
ok = new BigDecimal(split[0]);
}
if (omg.charAt(k) == '+') {
m++;
ok=ok.add(new BigDecimal(split[m]));
} else if (omg.charAt(k) == '-') {
m++;
ok = ok.subtract(new BigDecimal(split[m]));
} else if (omg.charAt(k) == '*') {
m++;
ok = ok.multiply(new BigDecimal(split[m]));
} else if (omg.charAt(k) == '/') {
m++;
ok = ok.divide(new BigDecimal(split[m]),2,RoundingMode.HALF_EVEN);
}
}
nc = nc.replace(toBeReplaced, ok + "");
}
}
String split[]=nc.split("\\+|\\-|\\*|\\/|\\=");
int k = 0;
for (int i = 0; i < nc.length(); i++) {
if (i == 0) {
j = new BigDecimal(split[0]);
}
if (nc.charAt(i) == '+') {
k++;
j = j.add(new BigDecimal(split[k]));
} else if (nc.charAt(i) == '-') {
k++;
j = j.subtract(new BigDecimal(split[k]));
} else if (nc.charAt(i) == '*') {
k++;
j = j.multiply(new BigDecimal(split[k]));
} else if (nc.charAt(i) == '/') {
k++;
j = j.divide(new BigDecimal(split[k]),2,RoundingMode.HALF_EVEN);
}
}
System.out.println(j.setScale(2, BigDecimal.ROUND_HALF_EVEN);