说明:Arith数学运算类来源于网络,Calculator计算类是我自己编写的。
源代码:
package testAwtAndSwing;
import java.math.BigDecimal;
/**
* @author 来源于网络
*
*/
public class Arith {
// 默认除法运算精度
private static final int DEF_DIV_SCALE = 10;
// 构造器私有化,让这个类不能实例化
private Arith() {
}
/**
* 精确的加法运算
*/
public static double add(double v1, double v2) {
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.add(b2).doubleValue();
}
/**
* 精确的减法运算
*/
public static double sub(double v1, double v2) {
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.subtract(b2).doubleValue();
}
/**
* 精确的乘法运算
*/
public static double mul(double v1, double v2) {
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.multiply(b2).doubleValue();
}
/**
* (相对)精确的除法运算,当发生除不尽的情况时,精确到小数点后10位的数字四舍五入
*/
public static double div(double v1, double v2) {
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static void main(String[] args) {
System.out.println("0.05 + 0.01 = " + Arith.add(0.05, 0.01));
System.out.println("12 + 456 = " + Arith.add(12, 456));
System.out.println("1.0 - 0.42 = " + Arith.sub(1.0, 0.42));
System.out.println("4.015 × 100 = " + Arith.mul(4.015, 100));
System.out.println("123.3 ÷ 2542355.323 = " + Arith.div(123.3, 2542355.323D));
System.out.println("123.3 ÷ 2542355.323 = " + Arith.div(123.3, Double.parseDouble("2542355.323")));
}
}
package testAwtAndSwing;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.regex.Pattern;
/**
* -Dfile.encoding=gbk
*
*/
public class Calculator {
private Frame f = new Frame("简易计算器");
private Panel textFieldPanel = new Panel();
private Panel mainPanel = new Panel();
private TextField tf = new TextField(30);
/** 被操作数,与opNum2(操作数)进行数值计算 */
private String opNum = null;
/** 操作符:+ - × ÷ */
private String op = null;
private Pattern zeroPattern = Pattern.compile("0+");
/** 背景颜色,非必须的属性 */
private Color bgColor = new Color(204, 238, 208);
public void init() {
this.tf.setBackground(this.bgColor);
this.tf.setEditable(false);
this.textFieldPanel.add(this.tf);
this.mainPanel.setLayout(new GridLayout(5, 4, 2, 4));
this.mainPanel.setBackground(this.bgColor);
String[] opNames = { "AC", "0", ".", "+", "7", "8", "9", "-", "4", "5", "6", "×", "1", "2", "3", "÷", "=" };
Button[] btns = new Button[17];
NumActionListener listener = new NumActionListener();
for (int i = 0; i < opNames.length; i++) {
btns[i] = new Button(opNames[i]);
btns[i].addActionListener(listener);
this.mainPanel.add(btns[i]);
}
this.f.add(this.textFieldPanel, BorderLayout.NORTH);
this.f.add(this.mainPanel);
this.f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.f.setLocationRelativeTo(null);
this.f.pack();
this.f.setVisible(true);
}
class NumActionListener implements ActionListener {
@SuppressWarnings("synthetic-access")
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
switch (cmd) {
case "AC":
Calculator.this.tf.setText("");
Calculator.this.opNum = null;
Calculator.this.op = null;
break;
case "+":
setDataIfOpNumNotNull(cmd);
break;
case "-":
setDataIfOpNumNotNull(cmd);
break;
case "×":
setDataIfOpNumNotNull(cmd);
break;
case "÷":
setDataIfOpNumNotNull(cmd);
break;
case "=":
String opNum2 = Calculator.this.tf.getText();
// 进行计算的两个数必须有值
if (Calculator.this.op == null || "".equals(opNum2)) {
return;
}
// 除数不能为0
if ("÷".equals(Calculator.this.op) && Double.parseDouble(opNum2) == 0) {
Calculator.this.tf.setText(Calculator.this.opNum);
Calculator.this.op = null;
return;
}
processResult(doCalculate(opNum2));
break;
default:
String input = Calculator.this.tf.getText() + cmd;
int point = input.indexOf('.');
if (point == 0) {
input = "0.";
// 比如cmd=. input=18.11. 这样的数是不被允许的,直接返回
} else if (point > 0) {
if (input.substring(point + 1).indexOf('.') > -1) {
return;
}
}
Calculator.this.tf.setText(input);
if (Calculator.this.op == null) {
Calculator.this.opNum = Calculator.this.tf.getText();
}
break;
}
}
@SuppressWarnings({ "synthetic-access", "incomplete-switch" })
private double doCalculate(String opNum2) {
double result = 0;
switch (Calculator.this.op) {
case "+":
result = Arith.add(Double.parseDouble(Calculator.this.opNum), Double.parseDouble(opNum2));
break;
case "-":
result = Arith.sub(Double.parseDouble(Calculator.this.opNum), Double.parseDouble(opNum2));
break;
case "×":
result = Arith.mul(Double.parseDouble(Calculator.this.opNum), Double.parseDouble(opNum2));
break;
case "÷":
result = Arith.div(Double.parseDouble(Calculator.this.opNum), Double.parseDouble(opNum2));
break;
}
return result;
}
@SuppressWarnings("synthetic-access")
private void setDataIfOpNumNotNull(String cmd) {
if (Calculator.this.opNum != null) {
Calculator.this.op = cmd;
Calculator.this.tf.setText("");
}
}
}
/**
* 处理结果:除去多余的0,将结果赋值到opNum,重置op,显示屏显示结果
*/
private void processResult(double result) {
String realResult = removeExtraZero(result);
this.opNum = realResult;
this.op = null;
this.tf.setText(realResult);
}
/**
* 传入:18.00,返回18;传入18.01,返回18.01
*/
private String removeExtraZero(double num) {
String result = String.valueOf(num);
int point = result.indexOf('.');
if (point > 0) {
String substr = result.substring(point + 1);
if (this.zeroPattern.matcher(substr).matches()) {
return result.substring(0, point);
}
}
return result;
}
public static void main(String[] args) {
new Calculator().init();
}
}