该程序复利计算(定额投资),单利计算,本金计算,利率计算,年限计算,银行贷款月还款额计算六项功能,并对空字符和错误字符做出了处理,并加以提醒,也对计算公式进行了测试,目前来说一切正常,如果有读者看出有什么问题,可以提醒一下我,我会及时做出修改。
package com.fulijisuanqi.swing; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class calcutor extends JFrame{ public static void main(String[] args) { // TODO Auto-generated method stub calcutor frame = new calcutor(); frame.setVisible(true); frame.setBounds(100, 100, 400, 400); frame.setTitle("计算器3.1"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private JPanel jpanel; private JLabel label,label00,label01,label02,label03,label04,label05; private JComboBox<Object> box; private JTextField field01,field02,field03,field04,field05; private JButton button; private static double benjin,lilv,nianxian,zhongzhi,dingtou,huankuan,daikuan; private int index = 0; public calcutor(){ jpanel = new JPanel(); jpanel.setBounds(0, 0, 400, 400); jpanel.setLayout(null); add(jpanel); label = new JLabel("计算类型:"); label.setFont(new Font(null, Font.BOLD, 15)); label.setBounds(10, 10, 80, 30); jpanel.add(label); label00 = new JLabel("@113wangzekai"); label00.setFont(new Font(null, Font.BOLD, 15)); label00.setBounds(260, 320, 200, 30); jpanel.add(label00); label01 = new JLabel("本金:"); label01.setFont(new Font(null, Font.BOLD, 15)); label01.setBounds(30, 80, 80, 30); jpanel.add(label01); label02 = new JLabel("年利率%:"); label02.setFont(new Font(null, Font.BOLD, 15)); label02.setBounds(30, 130, 80, 30); jpanel.add(label02); label03 = new JLabel("年限:"); label03.setFont(new Font(null, Font.BOLD, 15)); label03.setBounds(30, 180, 80, 30); jpanel.add(label03); label04 = new JLabel("定投金额:"); label04.setFont(new Font(null, Font.BOLD, 15)); label04.setBounds(30, 230, 80, 30); jpanel.add(label04); label05 = new JLabel("终值:"); label05.setFont(new Font(null, Font.BOLD, 15)); label05.setBounds(30, 280, 80, 30); jpanel.add(label05); //文本框 field01 = new JTextField(); field01.setBounds(120, 80, 150, 30); jpanel.add(field01); field02 = new JTextField(); field02.setBounds(120, 130, 150, 30); jpanel.add(field02); field03 = new JTextField(); field03.setBounds(120, 180, 150, 30); jpanel.add(field03); field04 = new JTextField(); field04.setBounds(120, 230, 150, 30); jpanel.add(field04); field05 = new JTextField(); field05.setBounds(120, 280, 150, 30); jpanel.add(field05); //初始化文本框 field05.setText("计算所得"); field05.setEnabled(false); //计算按钮 button = new JButton("计算"); button.setBounds(250, 10, 80, 30); button.setFont(new Font(null, Font.BOLD, 15)); jpanel.add(button); //按钮监听 button.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e){ if(index == 0){ zhongzhi = fulicalcutor(); field05.setText(Double.toString(zhongzhi)); field05.setEnabled(true); }else if(index == 1){ zhongzhi = danlicalcutor(); field04.setText(Double.toString(zhongzhi)); field04.setEnabled(true); }else if(index == 2){ benjin = benjincalcutor(); field01.setText(Double.toString(benjin)); field01.setEnabled(true); }else if(index == 3){ lilv = lilvcalcutor(); field02.setText(Double.toString(lilv)); field02.setEnabled(true); }else if(index == 4){ nianxian = nianxiancalcutor(); field03.setText(Double.toString(nianxian)); field03.setEnabled(true); }else if(index == 5){ huankuan = yuehuankuanejisuan(); field04.setText(Double.toString(huankuan)); field04.setEnabled(true); } } }); //下拉菜单 box = new JComboBox<>(); box.setFont(new Font(null, Font.BOLD, 15)); box.setModel(new DefaultComboBoxModel<Object>(new Object[]{"复利计算","单利计算","本金计算","利率计算","年限计算","月还款额计算"})); box.setBounds(90, 10, 130, 30); jpanel.add(box); box.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if(box.getSelectedIndex()==0){ index = 0; change01(); clear(); field05.setText("计算所得"); field05.setEnabled(false); //System.out.println("复利计算"); }else if(box.getSelectedIndex()==1){ index = 1; change(); clear(); field04.setText("计算所得"); field04.setEnabled(false); //System.out.println("单利计算"); }else if(box.getSelectedIndex()==2){ index = 2; change(); clear(); field01.setText("计算所得"); field01.setEnabled(false); //System.out.println("本金计算"); }else if(box.getSelectedIndex()==3){ index = 3; change(); clear(); field02.setText("计算所得"); field02.setEnabled(false); //System.out.println("利率计算"); }else if(box.getSelectedIndex()==4){ index = 4; change(); clear(); field03.setText("计算所得"); field03.setEnabled(false); }else if(box.getSelectedIndex()==5){ index = 5; change02(); clear(); field04.setText("计算所得"); field04.setEnabled(false); } } }); } //清除数据 private void clear() { field01.setText(null); field02.setText(null); field03.setText(null); field04.setText(null); field05.setText(null); field01.setEnabled(true); field02.setEnabled(true); field03.setEnabled(true); field04.setEnabled(true); field05.setEnabled(true); } //改变内容 private void change02() { label01.setText("贷款金额:"); label02.setText("年利率%:"); label03.setText("还款期限:"); label04.setText("月还款额:"); label05.setText(""); field05.setVisible(false); } private void change01() { label01.setText("本金:"); label02.setText("年利率%:"); label03.setText("年限:"); label04.setText("定投金额:"); label05.setText("终值:"); field05.setVisible(true); } private void change() { label01.setText("本金:"); label02.setText("年利率%:"); label03.setText("年限:"); label04.setText("终值:"); label05.setText(""); field05.setVisible(false); } //月还款额计算 private double yuehuankuanejisuan() { try { daikuan = Double.parseDouble(field01.getText()); lilv = Double.parseDouble(field02.getText()); nianxian = Double.parseDouble(field03.getText()); } catch (Exception e) { JOptionPane.showMessageDialog(jpanel, "请输入正确的数据"); //System.out.println("请输入数据"); } return yuehuankuan(daikuan,lilv,nianxian); } //月还款额的计算公式 public static double yuehuankuan(double daikuan, double lilv, double nianxian) { huankuan = daikuan * (lilv/12) * Math.pow( 1 + lilv/12 ,12 * nianxian)/(Math.pow(1 + lilv/12, 12 * nianxian)-1); huankuan = Math.round(huankuan*100)/100; return huankuan; } //年限计算 private double nianxiancalcutor() { try { zhongzhi = Double.parseDouble(field04.getText()); lilv = Double.parseDouble(field02.getText()); benjin = Double.parseDouble(field01.getText()); } catch (Exception e) { JOptionPane.showMessageDialog(jpanel, "请输入正确的数据"); //System.out.println("请输入数据"); } return nianxian(zhongzhi,lilv,benjin); } //年限的计算公式 public static double nianxian(double zhongzhi, double lilv, double benjin) { nianxian = (Math.log(zhongzhi / benjin) / Math.log(1 + lilv)); nianxian = Math.round(nianxian); return nianxian; } //利率计算 private double lilvcalcutor() { try { zhongzhi = Double.parseDouble(field04.getText()); nianxian = Double.parseDouble(field03.getText()); benjin = Double.parseDouble(field01.getText()); } catch (Exception e) { JOptionPane.showMessageDialog(jpanel, "请输入正确的数据"); //System.out.println("请输入数据"); } return lilv(zhongzhi,nianxian,benjin); } //利率的计算公式 public static double lilv(double zhongzhi, double nianxian, double benjin) { lilv = Math.pow((zhongzhi / benjin), (1.0 / nianxian)) - 1; lilv = Math.round(lilv*100)/100.0; return lilv; } //本金计算 private double benjincalcutor() { try { zhongzhi = Double.parseDouble(field04.getText()); lilv = Double.parseDouble(field02.getText()); nianxian = Double.parseDouble(field03.getText()); } catch (Exception e) { JOptionPane.showMessageDialog(jpanel, "请输入正确的数据"); //System.out.println("请输入数据"); } return benjin(zhongzhi,lilv,nianxian); } //本金的计算公式 public static double benjin(double zhongzhi, double lilv, double nianxian) { benjin = zhongzhi / (Math.pow(1 + lilv, nianxian)); benjin = Math.round(benjin*100)/100; return benjin; } //单利计算 private double danlicalcutor() { try { benjin = Double.parseDouble(field01.getText()); lilv = Double.parseDouble(field02.getText()); nianxian = Double.parseDouble(field03.getText()); } catch (Exception e) { JOptionPane.showMessageDialog(jpanel, "请输入正确的数据"); //System.out.println("请输入数据"); } return zhongzhi(benjin,lilv,nianxian); } //单利的计算公式 public static double zhongzhi(double benjin, double lilv, double nianxian) { zhongzhi = benjin * (1 + lilv * nianxian); zhongzhi = Math.round(zhongzhi*100)/100; return zhongzhi; } //复利计算 private double fulicalcutor() { try { benjin = Double.parseDouble(field01.getText()); lilv = Double.parseDouble(field02.getText()); nianxian = Double.parseDouble(field03.getText()); } catch (Exception e) { JOptionPane.showMessageDialog(jpanel, "请输入正确的数据"); //System.out.println("请输入数据"); } try { dingtou = Double.parseDouble(field04.getText()); } catch (NumberFormatException e2) { dingtou = 0; } return zhongzhi(benjin,lilv,nianxian,dingtou); } //复利的计算公式 public static double zhongzhi(double benjin, double lilv, double nianxian, double dingtou) { for(int i = 0;i < nianxian;i++){ benjin = benjin * (1 + lilv); benjin = benjin + dingtou; } zhongzhi = benjin - dingtou; zhongzhi = Math.round(zhongzhi*100)/100; return zhongzhi; } }
程序运行结果如下:
测试代码如下:
package com.fulijisuanqi.Test; import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.*; import org.junit.Test; import com.fulijisuanqi.swing.calcutor; public class calculatorTest { @Test public void testYuehuankuan() { calcutor cutor = new calcutor(); double str1 = cutor.yuehuankuan(100000, 0.05, 10); assertThat(str1, is(1060.0)); } @Test public void testNianxian() { calcutor cutor = new calcutor(); double str2 = cutor.nianxian(220000, 0.03, 100000); assertThat(str2, is(27.0)); } @Test public void testLilv() { calcutor cutor = new calcutor(); double str2 = cutor.lilv(200000, 30, 100000); assertThat(str2, is(0.02)); } @Test public void testBenjin() { calcutor cutor = new calcutor(); double str2 = cutor.benjin(3000000, 0.05, 20); assertThat(str2, is(1130668.0)); } @Test public void testZhongzhiDoubleDoubleDouble() { calcutor cutor = new calcutor(); double str2 = cutor.zhongzhi(100000, 0.03, 30); assertThat(str2, is(190000.0)); } @Test public void testZhongzhiDoubleDoubleDoubleDouble() { calcutor cutor = new calcutor(); double str2 = cutor.zhongzhi(100000, 0.03, 30, 0); assertThat(str2, is(242726.0)); } }
测试结果如下: