zoukankan      html  css  js  c++  java
  • Java实现的窗口计算器

    计算器代码如下:

      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 < 10) {
     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 < 0) {
    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 }

    运行截图如下:

    敬请指正。

  • 相关阅读:
    [LOJ 6436][PKUSC2018] 神仙的游戏
    [BZOJ 2653] middle
    [WC2018] 州区划分
    [BZOJ 4556][Tjoi2016&Heoi2016]字符串
    [BZOJ 3514]Codechef MARCH14 GERALD07加强版 (CHEF AND GRAPH QUERIES)
    [BZOJ 4573][ZJOI 2016]大♂森林
    Problem 2322. -- [BeiJing2011]梦想封印
    [BZOJ 2555] SubString
    [日常] NOIWC2019 冬眠记
    [BZOJ 4036][HAOI2015]按位或
  • 原文地址:https://www.cnblogs.com/minnn/p/13187680.html
Copyright © 2011-2022 走看看