java浮点数运算在计算器上的应用

 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);
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值