免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1050 | 回复: 0
打印 上一主题 下一主题

计算器程序.可以准确进行浮点数运算 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-07 22:49 |只看该作者 |倒序浏览
//小弟刚学java,程序中写的不妥的地方还望高手们指教,同样的菜鸟们共同学习
//因为布局管理器都还没看,所以不知道有什么好布局可用,就干脆null,setbounds了,麻烦
//不过很简单
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.math.*;
public class MyCal
{
public static void main(String args[])
{
new MyFrame();
}
}
class MyFrame extends Frame
implements ActionListener
         //这是自定义的界面窗口类,同时也监听器
{         //下面定义将用到的17个button和1个textfield
   double num1=0,num2=0,result;
int fuhao=0;
boolean ready=true;
//ready表示重新输数。有了这个标志,上次运算结果仍然显示在textfield上,
   //直接按数字键不会跟在上次结果后面,而可以不按C就直接进行下次运算。
   Button b1=new Button("1");
Button b2=new Button("2");
Button b3=new Button("3");
Button b4=new Button("4");
Button b5=new Button("5");
Button b6=new Button("6");
Button b7=new Button("7");
Button b8=new Button("8");
Button b9=new Button("9");
Button b0=new Button("0");
Button bp=new Button(".");    //p,小数点
Button be=new Button("=");    //e,=号
Button bchu=new Button("/");
Button bcheng=new Button("*");
Button bjian=new Button("-");
Button bjia=new Button("+");
Button bc=new Button("c");
JTextField tf=new JTextField();
MyFrame()
{   //构造方法,初始化,把button和textfield添加到frame上。
   //并注册事件监听
tf.setBounds(40,60,200,20);
tf.setEditable(false);
tf.setHorizontalAlignment(JTextField.RIGHT);
b1.setBounds(40,100,40,20);
b2.setBounds(100,100,40,20);
b3.setBounds(160,100,40,20);
bchu.setBounds(220,100,40,20);
b4.setBounds(40,140,40,20);
b5.setBounds(100,140,40,20);
b6.setBounds(160,140,40,20);
bcheng.setBounds(220,140,40,20);
b7.setBounds(40,180,40,20);
b8.setBounds(100,180,40,20);
b9.setBounds(160,180,40,20);
bjia.setBounds(220,180,40,20);
b0.setBounds(40,220,40,20);
bp.setBounds(100,220,40,20);
be.setBounds(160,220,40,20);
bjian.setBounds(220,220,40,20);
bc.setBounds(280,100,40,20);
this.setLayout(null);
this.setBounds(300,250,360,280);
this.setResizable(false);
this.settitle("我的计算器");
this.add(b1);
this.add(b2);
this.add(b3);
this.add(b4);
this.add(b5);
this.add(b6);
this.add(b7);
this.add(b8);
this.add(b9);
this.add(b0);
this.add(bp);
this.add(be);
this.add(bchu);
this.add(bcheng);
this.add(bjian);
this.add(bjia);
this.add(bc);
this.add(tf);
this.setVisible(true);
this.addWindowListener(new ClzMain());
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
b5.addActionListener(this);
b6.addActionListener(this);
b7.addActionListener(this);
b8.addActionListener(this);
b9.addActionListener(this);
b0.addActionListener(this);
bp.addActionListener(this);
be.addActionListener(this);
bjia.addActionListener(this);
bjian.addActionListener(this);
bcheng.addActionListener(this);
bchu.addActionListener(this);
bc.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
//因这个类是监听器,所以必须有这个方法。
if(e.getSource()==b1)
{
if(ready)
{tf.setText("1");ready=false;}
else
tf.setText(tf.getText()+"1");
}
if(e.getSource()==b2)
{
if(ready)
{tf.setText("2");ready=false;}
else
tf.setText(tf.getText()+"2");
}
if(e.getSource()==b3)
{
if(ready)
{tf.setText("3");ready=false;}
else
tf.setText(tf.getText()+"3");
}
if(e.getSource()==b4)
{
if(ready)
{tf.setText("4");ready=false;}
else
tf.setText(tf.getText()+"4");
}
if(e.getSource()==b5)
{
if(ready)
{tf.setText("5");ready=false;}
else
tf.setText(tf.getText()+"5");
}
if(e.getSource()==b6)
{
if(ready)
{tf.setText("6");ready=false;}
else
tf.setText(tf.getText()+"6");
}
if(e.getSource()==b7)
{
if(ready)
{tf.setText("7");ready=false;}
else
tf.setText(tf.getText()+"7");
}
if(e.getSource()==b8)
{
if(ready)
{tf.setText("8");ready=false;}
else
tf.setText(tf.getText()+"8");
}
if(e.getSource()==b9)
{
if(ready)
{tf.setText("9");ready=false;}
else
tf.setText(tf.getText()+"9");
}
if(e.getSource()==b0)
{
if(ready)
{tf.setText("0");ready=false;}
else
tf.setText(tf.getText()+"0");
}
if(e.getSource()==bp)
{
if(ready)
{tf.setText("0.");ready=false;}
else
tf.setText(tf.getText()+".");
}
if(e.getSource()==bc)
{
fuhao=0;num1=num2=result=0;ready=true;tf.setText("");
}
if(e.getSource()==bjia)
{
fuhao=1;ready=true;
num1=Double.valueOf(tf.getText()).doubleValue();
System.out.println("num1="+num1);
tf.setText("");
}
if(e.getSource()==bjian)
{
fuhao=2;ready=true;
num1=Double.valueOf(tf.getText()).doubleValue();
System.out.println("num1="+num1);
   tf.setText("");
}
if(e.getSource()==bcheng)
{
fuhao=3;ready=true;
num1=Double.valueOf(tf.getText()).doubleValue();
System.out.println("num1="+num1);
   tf.setText("");
}
if(e.getSource()==bchu)
{
fuhao=4;ready=true;
num1=Double.valueOf(tf.getText()).doubleValue();
System.out.println("num1="+num1);
   tf.setText("");
}
if(e.getSource()==be)
{
if(fuhao!=0)
{
num2=Double.valueOf(tf.getText()).doubleValue();
System.out.println("num2="+num2);
if(fuhao==1)
result=add(num1,num2);
if(fuhao==2)
result=sub(num1,num2);
if(fuhao==3)
result=mul(num1,num2);
if(fuhao==4)
result=div(num1,num2,10);
System.out.println("result="+result);
//解决.0的问题 如果以".0"结尾,就取子串,把.0去掉。
if(String.valueOf(result).endsWith(".0"))
tf.setText(String.valueOf(result).substring(0,String.valueOf(result).length()-2));
else tf.setText(String.valueOf(result));
ready=true;fuhao=0;
}
}
}
//浮点数四则运算必须用下面四个方法,如果直接进行运算会出错。
public static double add(double v1,double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));
       return b1.add(b2).doubleValue();
    }
    public static double sub(double v1,double v2)
    {
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));
       return b1.subtract(b2).doubleValue();
    }
   
    public static double mul(double v1,double v2)
    {
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));
       return b1.multiply(b2).doubleValue();
    }
    public static double div(double v1,double v2,int scale)
    {      
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));
       return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}
class ClzMain extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
e.getWindow().dispose();
System.exit(0);
}
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/11570/showart_82319.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP