📄 calculator.java
字号:
number2 = new BigDecimal(Display.getText());
if (afterSignalFlag){
secondNumber = true; //若此时已经输入过+-*/号,则开放后的数作为第二运算数
afterSignalFlag = false;
}
begin = true;
afterSqrt = true;
}catch (NumberException e) { //异常处理
Display.setText("函数输入无效。");
inputStop = true;
}
}
}
});
//1/x键:
Button1[14].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
if (!inputStop) { //在能输入的情况下
try {
BigDecimal d = new BigDecimal(Display.getText());
//若当前数为零,则抛出异常
if (d.equals(BigDecimal.ZERO)){
throw new NumberException();
}
//除法运算:
d = BigDecimal.ONE.divide(d,64,RoundingMode.HALF_UP);
Display.setText(output(d));
number2 = new BigDecimal(Display.getText());
if (afterSignalFlag){ //若此时已经输入过+-*/号,则开放后的数作为第二运算数
secondNumber = true;
afterSignalFlag = false;
}
begin = true;
afterSqrt = true;
}catch (NumberException e) { //异常处理
Display.setText("除数不能为零。");
inputStop = true;
}
}
}
});
//%键:
Button1[9].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
if (!inputStop) { //在当前能输入的情况下
BigDecimal d = new BigDecimal(Display.getText());
d = d.multiply(number1).divide(new BigDecimal("100"));
Display.setText(output(d));
number2 = new BigDecimal(Display.getText());
if (afterSignalFlag){ //若此时已经输入过+-*/号,则开放后的数作为第二运算数
secondNumber = true;
afterSignalFlag = false;
}
begin = true;
afterSqrt = true;
}
}
});
//+键:
Button1[18].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
operate (1);
}
});
//-键:
Button1[13].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
operate (2);
}
});
//*键:
Button1[8].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
operate (3);
}
});
// /键:
Button1[3].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event) {
operate (4);
}
});
Button1[19].addActionListener(this);
}
//成员函数:
// =键:
public void actionPerformed(ActionEvent event) {
if (!inputStop) { //在当前能输入的情况下:
//已经输入了第二运算数
if (secondNumber) {
addSubMulDiv (number2); //进行+-*/中的一种运算
}
//还没有输入第二运算数,但已经输入了运算符号
else if (afterSignalFlag) {
//把第一运算数作为第二运算数
number2 = new BigDecimal(number1.toString());
addSubMulDiv (number1);
}
//没有输入第二运算数,也没有输入运算符号,则把上次运算时的运算符号作为此次的运算符号,把上次运算的第二运算数作为此次的第二运算数
else if ((!afterSignalFlag && !secondNumber && this.signalFlag != 0)||(afterSqrt && begin && this.signalFlag != 0)) {
addSubMulDiv (number2);
}
doubleFlag = false;
afterSignalFlag = false;
secondNumber = false;
begin = true;
afterSqrt = false;
}
}
//按下数字键,在屏幕上加一个数字:
public void addANumber (Integer number) {
if (!inputStop) {
//开始新一次的运算,输入的数作为第一运算数:
if (begin && !afterSqrt) {
Display.setText(number.toString() + ".");
doubleFlag = false;
afterSignalFlag = false;
secondNumber = false;
begin = false;
afterSqrt = false;
}
//在开放,%,1/x运算后,放弃原来的第二运算数,以当前的输入作为第二运算数:
else if (begin && afterSqrt) {
Display.setText(number.toString() + ".");
number2 = new BigDecimal(Display.getText());
doubleFlag = false;
afterSignalFlag = false;
secondNumber = true;
begin = false;
afterSqrt = false;
}
else {
//在输入+-*/号后,开始添加第二运算数
if (afterSignalFlag ){
Display.setText(number.toString() + ".");
number2 = new BigDecimal(Display.getText());
afterSignalFlag = false;
secondNumber = true;
afterSqrt = false;
}
//在输入数字的过程中,添加一个数字
else {
if (Display.getText().length() < MAX_LENGTH){
if (doubleFlag) {
Display.append(number.toString());
}
else {
if (this.Display.getText().equals("0.")) {
Display.setText(number.toString() + ".");
}
else {
Display.insert(number.toString(), this.Display.getText().length() - 1);
}
}
number2 = new BigDecimal(Display.getText());
}
}
}
}
}
//按下加减乘除后的运算
public void operate (int signalFlag) {
if (!inputStop) {
//已经存在第二运算数,则执行运算,此时的作用相当于等号
if (secondNumber) {
secondNumber = false;
afterSignalFlag = true;
doubleFlag = false;
begin = false;
afterSqrt = false;
addSubMulDiv (number2);
this.signalFlag = signalFlag; //记录新的运算符号
number2 = new BigDecimal(Display.getText());
}
//还没有输入第二运算数时,不执行运算,只记录符号
else {
afterSignalFlag = true;
secondNumber = false;
doubleFlag = false;
begin = false;
afterSqrt = false;
this.signalFlag = signalFlag;
number1 = new BigDecimal(Display.getText());
}
}
}
//加减乘除运算:
public void addSubMulDiv (BigDecimal number2) {
switch (this.signalFlag) {
case 1: number1 = number1.add(number2);break;
case 2: number1 = number1.subtract(number2);break;
case 3: number1 = number1.multiply(number2);break;
case 4: {
try {
//除数为零时,抛出异常;
if (number2.equals(BigDecimal.ZERO)) {
throw new NumberException ();
}
//得到的商作为第一运算数,有小数的话实行四舍五入原则
number1 = number1.divide(number2, 34, RoundingMode.HALF_UP);
}catch (NumberException e) {
Display.setText("除数不能为零。");
inputStop = true;
}
break;
}
}
if (!inputStop){
Display.setText(output(number1));
}
}
//输出在屏幕上的数字
public String output (BigDecimal a) {
a = a.round(new MathContext(32)); //表示成32位
a = a.stripTrailingZeros(); //去除小数点后多余的零
try {
int c = a.toString().lastIndexOf("E");
new BigDecimal(a.toString()).toBigIntegerExact();
if (c == -1) {
return a.toString() + ".";
}
else {
if (a.compareTo(new BigDecimal("99999999999999999999999999999999")) == -1) {
return a.toPlainString() + ".";
}
return a.toString();
}
}catch (ArithmeticException e) {
return a.toString();
}
}
public static void main(String[] args) {
//界面为当前的计算机设置的界面
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}catch(Exception e){
throw new RuntimeException(e);
}
Calculator calculator = new Calculator();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -