Java实现的窗口计算器
2021-05-06 22:28
标签:close com scale inf add false vax import eof 计算器代码如下: 运行截图如下: 敬请指正。 Java实现的窗口计算器 标签:close com scale inf add false vax import eof 原文地址:https://www.cnblogs.com/minnn/p/13187680.html 1 package ljm.calculator;
2
3 import javax.swing.*;
4 import java.awt.*;
5 import java.io.Serializable;
6 import java.math.*;
7
8 public class Main {
9 public static void main(String[] args) {
10 new Calculator("敏敏敏牌计算器 - ljm@lpqo.cn");
11 }
12 }
13
14 class Calculator extends JFrame {
15 private TextArea show; // 显示
16
17 public Calculator(String t){
18 super(t);
19 setLayout(null);
20 setSize(430,488);
21 setVisible(true);
22 setLocationRelativeTo(null);
23 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
24 setResizable(false);
25 this.setBackground(new Color(237, 239, 238));
26
27 setShow();
28 addBut();
29 setVisible(true);
30 }
31
32 private void setShow() {
33 show = new TextArea("",8,52,1);
34 show.setSize(415,102);
35 show.setLocation(0,0);
36 show.setFont(new Font("", Font.BOLD, 40));
37 show.setBackground(Color.WHITE);
38 show.setForeground(new Color(48, 48, 48));
39 show.setEditable(false);
40 show.setText(0 + "");
41 this.add(show);
42 }
43
44 private double nub1 = 0; // 数1
45 private double nub2 = 0; // 数2
46 private String snub2 = ""; // 数2的字符串型
47 private int f = ‘+‘; // 运算符号
48 private boolean isDoc = false; // 是否有小数点
49 private boolean isEqual = false; // 是否点击等于
50 private int nubLen = 0;
51
52 private void setBut(String s, int i, int j, int x, int y, final int c) {
53 Button b = new Button(s);
54 b.setLocation(x, y);
55 b.setSize(i, j);
56 b.setFont(new Font("", Font.BOLD, 35));
57 b.setBackground(new Color(254, 254, 254));
58 b.setForeground(new Color(88, 92, 100));
59
60 // 计算逻辑算法
61 // Ljm ljm@lpqo.cn
62 // 2020.6.23 JXUT
63 b.addActionListener(e -> {
64 if (c ) {
65 // 数字0-9
66 if (isEqual) {
67 nub1 = 0;
68 }
69 if (nubLen > 20) {
70 return;
71 }
72 if (c == 0 && nub2 == 0 ) {
73 return;
74 }
75 snub2 += String.valueOf(c);
76 show.setText(snub2);
77 nubLen = show.getText().length();
78 nub2 = Double.parseDouble(snub2);
79
80 } else if (c == ‘.‘) {
81 // 小数
82 if (nubLen > 20) {
83 return;
84 }
85 if (!isDoc) {
86 if (nub2 != 0) {
87 snub2 += ".";
88 } else {
89 snub2 = "0.";
90 }
91 nub2 = Double.parseDouble(snub2);
92 show.setText(snub2);
93 isDoc = true;
94 }
95
96 } else if (c == ‘S‘) {
97 // 结果相反数
98 if (Double.parseDouble(show.getText()) == nub1) {
99 nub1 = 0 - nub1;
100 showf(nub1 +"");
101 } else {
102 nub2 = 0 -nub2;
103 showf(nub2 +"");
104 }
105 } else if (c == ‘C‘) {
106 // 归零
107 nub1 = 0;
108 nub2 = 0;
109 snub2 = "";
110 f = ‘+‘;
111 isDoc = false;
112 isEqual = false;
113 nubLen = 0;
114 showf("0");
115 } else {
116 isEqual = false;
117 nubLen = 0;
118
119 switch (f) {
120 case ‘/‘:
121 // 除法
122 nub1 = DoubleUtil.divide(nub1, nub2);
123 break;
124 case ‘*‘:
125 // 乘法
126 nub1 = DoubleUtil.mul(nub1, nub2);
127 break;
128 case ‘-‘:
129 // 减法
130 nub1 = DoubleUtil.sub(nub1, nub2);
131 break;
132 case ‘+‘:
133 // 加法
134 nub1 = DoubleUtil.add(nub1, nub2);
135 break;
136 }
137
138 showf(nub1 + "");
139 if (c != ‘=‘) {
140 f = c;
141 } else {
142 // 等于
143 f = ‘+‘;
144 isEqual = true;
145 }
146
147 nub2 = 0;
148 snub2 = "";
149 isDoc = false;
150 }
151 });
152 this.add(b);
153 }
154
155
156 // 去0小数
157 private void showf(String s ){
158 double td = Double.parseDouble(s);
159 int ti = (int)td;
160
161 if (td == ti) {
162 show.setText(ti +"");
163 } else {
164 show.setText(td + "");
165 }
166 }
167
168 private void addBut() {
169 setBut("AC", 215, 70, 0, 100, ‘C‘);
170 setBut("±", 107, 70, 214, 100, ‘S‘);
171 setBut("÷", 108, 70, 312, 100, ‘/‘);
172
173 setBut("7", 107, 70, 0, 170, 7);
174 setBut("8", 108, 70, 107, 170, 8);
175 setBut("9", 107, 70, 214, 170, 9);
176 setBut("×", 108, 70, 312, 170, ‘*‘);
177
178 setBut("4", 107, 70, 0, 240, 4);
179 setBut("5", 108, 70, 107, 240, 5);
180 setBut("6", 107, 70, 214, 240, 6);
181 setBut("-", 108, 70, 312, 240, ‘-‘);
182
183 setBut("1", 107, 70, 0, 310, 1);
184 setBut("2", 108, 70, 107, 310, 2);
185 setBut("3", 107, 70, 214, 310, 3);
186 setBut("+", 108, 70, 312, 310, ‘+‘);
187
188 setBut("0", 107, 70, 0, 380, 0);
189 setBut(".", 108, 70, 107, 380, ‘.‘);
190 setBut("=", 215, 70, 214, 380, ‘=‘);
191 }
192
193 }
194
195 // BigDecimal的Double精确计算
196 class DoubleUtil implements Serializable {
197 private static final long serialVersionUID = -3345205828566485102L;
198 private static final Integer DEF_DIV_SCALE = 40; // 除法精度
199
200 // 精确加
201 public static Double add(Double value1, Double value2) {
202 BigDecimal b1 = new BigDecimal(Double.toString(value1));
203 BigDecimal b2 = new BigDecimal(Double.toString(value2));
204 return b1.add(b2).doubleValue();
205 }
206
207 // 精确减
208 public static double sub(Double value1, Double value2) {
209 BigDecimal b1 = new BigDecimal(Double.toString(value1));
210 BigDecimal b2 = new BigDecimal(Double.toString(value2));
211 return b1.subtract(b2).doubleValue();
212 }
213
214 // 精确乘
215 public static Double mul(Double value1, Double value2) {
216 BigDecimal b1 = new BigDecimal(Double.toString(value1));
217 BigDecimal b2 = new BigDecimal(Double.toString(value2));
218 return b1.multiply(b2).doubleValue();
219 }
220
221 // 精确除 精度为 DEF_DIV_SCALE
222 public static Double divide(Double dividend, Double divisor) {
223 return divide(dividend, divisor, DEF_DIV_SCALE);
224 }
225
226 // 精确除
227 public static double divide(Double dividend, Double divisor, Integer scale) {
228 if (scale ) {
229 return -1;
230 }
231 BigDecimal b1 = new BigDecimal(Double.toString(dividend));
232 BigDecimal b2 = new BigDecimal(Double.toString(divisor));
233 return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
234 }
235
236 }
上一篇:Python异常处理