Java 科学计算器代码
以下是一个完整的Java科学计算器实现,包含基本运算和科学功能:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
public class ScientificCalculator extends JFrame {
private JTextField display;
private String input = "";
private boolean newInput = true;
private Map<String, Double> memory = new HashMap<>();
public ScientificCalculator() {
setTitle("科学计算器");
setSize(400, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
// 显示面板
JPanel displayPanel = new JPanel();
display = new JTextField();
display.setFont(new Font("Arial", Font.PLAIN, 24));
display.setHorizontalAlignment(JTextField.RIGHT);
display.setEditable(false);
displayPanel.add(display);
add(displayPanel, BorderLayout.NORTH);
// 按钮面板
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(7, 5, 5, 5));
// 按钮文本
String[] buttonLabels = {
"MC", "MR", "MS", "M+", "M-",
"sin", "cos", "tan", "log", "ln",
"x²", "√", "x^y", "e^x", "n!",
"(", ")", "π", "e", "C",
"7", "8", "9", "/", "DEL",
"4", "5", "6", "*", "%",
"1", "2", "3", "-", "1/x",
"0", ".", "±", "+", "="
};
// 创建按钮并添加监听器
for (String label : buttonLabels) {
JButton button = new JButton(label);
button.setFont(new Font("Arial", Font.PLAIN, 16));
button.addActionListener(new ButtonClickListener());
buttonPanel.add(button);
}
add(buttonPanel, BorderLayout.CENTER);
}
private class ButtonClickListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
try {
switch (command) {
case "C":
input = "";
display.setText("");
newInput = true;
break;
case "DEL":
if (input.length() > 0) {
input = input.substring(0, input.length() - 1);
display.setText(input);
}
break;
case "=":
if (!input.isEmpty()) {
String result = evaluateExpression(input);
display.setText(result);
input = result;
newInput = true;
}
break;
case "sin":
if (!input.isEmpty()) {
double value = Math.sin(Math.toRadians(Double.parseDouble(input)));
input = String.valueOf(value);
display.setText(input);
}
break;
case "cos":
if (!input.isEmpty()) {
double value = Math.cos(Math.toRadians(Double.parseDouble(input)));
input = String.valueOf(value);
display.setText(input);
}
break;
case "tan":
if (!input.isEmpty()) {
double value = Math.tan(Math.toRadians(Double.parseDouble(input)));
input = String.valueOf(value);
display.setText(input);
}
break;
case "log":
if (!input.isEmpty()) {
double value = Math.log10(Double.parseDouble(input));
input = String.valueOf(value);
display.setText(input);
}
break;
case "ln":
if (!input.isEmpty()) {
double value = Math.log(Double.parseDouble(input));
input = String.valueOf(value);
display.setText(input);
}
break;
case "x²":
if (!input.isEmpty()) {
double value = Math.pow(Double.parseDouble(input), 2);
input = String.valueOf(value);
display.setText(input);
}
break;
case "√":
if (!input.isEmpty()) {
double value = Math.sqrt(Double.parseDouble(input));
input = String.valueOf(value);
display.setText(input);
}
break;
case "x^y":
input += "^";
display.setText(input);
break;
case "e^x":
if (!input.isEmpty()) {
double value = Math.exp(Double.parseDouble(input));
input = String.valueOf(value);
display.setText(input);
}
break;
case "n!":
if (!input.isEmpty()) {
int n = Integer.parseInt(input);
double factorial = 1;
for (int i = 1; i <= n; i++) {
factorial *= i;
}
input = String.valueOf(factorial);
display.setText(input);
}
break;
case "π":
input += String.valueOf(Math.PI);
display.setText(input);
break;
case "e":
input += String.valueOf(Math.E);
display.setText(input);
break;
case "±":
if (!input.isEmpty()) {
if (input.startsWith("-")) {
input = input.substring(1);
} else {
input = "-" + input;
}
display.setText(input);
}
break;
case "1/x":
if (!input.isEmpty()) {
double value = 1 / Double.parseDouble(input);
input = String.valueOf(value);
display.setText(input);
}
break;
case "MC":
memory.clear();
break;
case "MR":
if (!memory.isEmpty()) {
input = String.valueOf(memory.values().iterator().next());
display.setText(input);
}
break;
case "MS":
if (!input.isEmpty()) {
memory.put("M", Double.parseDouble(input));
}
break;
case "M+":
if (!input.isEmpty() && !memory.isEmpty()) {
double currentValue = memory.values().iterator().next();
memory.put("M", currentValue + Double.parseDouble(input));
}
break;
case "M-":
if (!input.isEmpty() && !memory.isEmpty()) {
double currentValue = memory.values().iterator().next();
memory.put("M", currentValue - Double.parseDouble(input));
}
break;
default:
if (newInput) {
input = command;
newInput = false;
} else {
input += command;
}
display.setText(input);
break;
}
} catch (NumberFormatException ex) {
display.setText("错误");
input = "";
newInput = true;
} catch (Exception ex) {
display.setText("错误");
input = "";
newInput = true;
}
}
}
private String evaluateExpression(String expression) {
try {
// 处理特殊字符
expression = expression.replace("π", String.valueOf(Math.PI));
expression = expression.replace("e", String.valueOf(Math.E));
// 处理幂运算
expression = expression.replace("^", "**");
// 使用ScriptEngine计算表达式
javax.script.ScriptEngine engine = new javax.script.ScriptEngineManager().getEngineByName("js");
Object result = engine.eval(expression);
return String.valueOf(result);
} catch (Exception e) {
return "错误";
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
ScientificCalculator calculator = new ScientificCalculator();
calculator.setVisible(true);
});
}
}
功能说明
这个科学计算器包含以下功能:
- 基本运算:加(+)、减(-)、乘(*)、除(/)、百分号(%)
- 科学函数:
- 三角函数:sin, cos, tan
- 对数函数:log, ln
- 幂运算:x², x^y, e^x
- 其他:√, n!, 1/x
- 常数:π, e
- 内存功能:MC, MR, MS, M+, M-
- 其他功能:
- 清除(C)
- 删除(DEL)
- 正负号(±)
- 括号()
使用说明
- 将代码复制到Java开发环境中
- 编译并运行程序
- 使用鼠标点击按钮进行计算
注意事项
- 这个计算器使用了JavaScript引擎来解析数学表达式,因此需要JDK 6或更高版本
- 对于复杂的表达式,计算结果可能会有精度误差
- 错误处理比较简单,实际应用中可能需要更完善的错误处理机制
如果需要更高级的功能或更好的性能,可以考虑使用专门的数学表达式解析库如exp4j或Java的Math库来实现计算功能。

