通过bigdecimal实现一个可以运算数学表达式的计算器
时间: 2024-10-01 20:10:05 浏览: 18
在Java中,我们可以利用`java.math.BigDecimal`类来实现一个精度较高的计算器,它可以处理任意大小的十进制数,非常适合复杂的数学计算,包括加减乘除、幂运算以及一些常见的数学函数。以下是创建一个基本的数学表达式计算器的基本步骤:
1. 创建一个方法,接受一个字符串类型的数学表达式作为输入。
2. 使用正则表达式解析这个表达式,将其分割成操作数和运算符的列表。
3. 遍历这个列表,使用BigDecimal的相应方法(如add(), subtract(), multiply(), divide()等)进行计算。
4. 对于每个运算符,需要先对操作数进行评估,然后应用适当的运算。
```java
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class BigDecimalCalculator {
public static BigDecimal calculate(String expression) {
List<String> tokens = tokenize(expression);
return evaluateExpression(tokens);
}
private static List<String> tokenize(String expression) {
// 正则表达式匹配操作数和运算符
String regex = "(\\d+\\.?\\d*|\\-\\d+\\.?\\d*)|([+\\-*/^])";
List<String> tokens = new ArrayList<>();
while (expression.matches(regex)) {
tokens.add(expression.substring(0, expression.length()));
expression = expression.substring(expression.length());
}
if (!expression.isEmpty()) {
throw new IllegalArgumentException("Invalid expression");
}
return tokens;
}
private static BigDecimal evaluateExpression(List<String> tokens) {
BigDecimal result = new BigDecimal(tokens.get(0));
for (int i = 1; i < tokens.size(); i += 2) { // 每两个元素一组,一个操作符,一个操作数
BigDecimal operand = new BigDecimal(tokens.get(i));
switch (tokens.get(i - 1)) {
case "+":
result = result.add(operand);
break;
case "-":
result = result.subtract(operand);
break;
case "*":
result = result.multiply(operand);
break;
case "/":
result = result.divide(operand, BigDecimal.ROUND_HALF_UP); // 控制四舍五入规则
break;
case "^":
result = result.pow(new BigDecimal(tokens.get(i + 1)));
i++;
break;
default:
throw new IllegalArgumentException("Unknown operator");
}
}
return result;
}
}