编写了这样一个计算器程序//程序文件名为CalculaterGUI.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;public class CalculaterGUI extends JFrame implements ActionListener
{
JPanel panel = new JPanel();
JTextField tf = new JTextField();
String names[] = {"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};
JButton buttons[] = new JButton[16];
JButton c = new JButton("C");
double sum = 0;
Vector v1 = new Vector(1,1);
Vector v2 = new Vector(1,1);
public CalculaterGUI(String title)
{
super(title); tf.setHorizontalAlignment(JTextField.RIGHT);
tf.setEditable(false);
panel.setLayout(new GridLayout(4,4));
getContentPane().add(tf,BorderLayout.NORTH);
getContentPane().add(panel,BorderLayout.CENTER);
getContentPane().add(c,BorderLayout.EAST);
for(int i=0;i<buttons.length;i++)
{
buttons[i] = new JButton(names[i]);
panel.add(buttons[i]);
} buttons[0].addActionListener(this);
buttons[1].addActionListener(this);
buttons[2].addActionListener(this);
buttons[3].addActionListener(this);
buttons[4].addActionListener(this);
buttons[5].addActionListener(this);
buttons[6].addActionListener(this);
buttons[7].addActionListener(this);
buttons[8].addActionListener(this);
buttons[9].addActionListener(this);
buttons[10].addActionListener(this);
buttons[11].addActionListener(this);
buttons[12].addActionListener(this);
buttons[13].addActionListener(this);
buttons[14].addActionListener(this);
buttons[15].addActionListener(this);
c.addActionListener(this); setSize(230,180);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); v1.addElement(new String("init"));
v2.addElement(new String("init"));
} public void actionPerformed(ActionEvent e)
{
String str = tf.getText(); if(e.getActionCommand()=="C")
{
sum = 0;
tf.setText("");
} if(e.getActionCommand()=="0"||
e.getActionCommand()=="1"||
e.getActionCommand()=="2"||
e.getActionCommand()=="3"||
e.getActionCommand()=="4"||
e.getActionCommand()=="5"||
e.getActionCommand()=="6"||
e.getActionCommand()=="7"||
e.getActionCommand()=="8"||
e.getActionCommand()=="9"||
e.getActionCommand()==".")
{
if(
("+").equals((String)v1.lastElement())||
("-").equals((String)v1.lastElement())||
("*").equals((String)v1.lastElement())||
("/").equals((String)v1.lastElement())||
("init").equals((String)v1.lastElement())
)
{
tf.setText("");
tf.setText(e.getActionCommand());
}
else if(("=").equals((String)v1.lastElement()))
{
sum = 0;
tf.setText("");
tf.setText(e.getActionCommand());
}
else
{
tf.setText(tf.getText() + e.getActionCommand());
}
v1.addElement(new String(e.getActionCommand()));
} if(e.getActionCommand()=="+")
{
if
(
("+").equals((String)v1.lastElement())||
("-").equals((String)v1.lastElement())||
("*").equals((String)v1.lastElement())||
("/").equals((String)v1.lastElement())||
("=").equals((String)v1.lastElement())||
("init").equals((String)v1.lastElement())
)
{
tf.setText(tf.getText());
}
else
{
double d = Double.parseDouble(str);
if(("+").equals((String)v2.lastElement()))
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
else if(("-").equals((String)v2.lastElement()))
{
sum = sum - d;
tf.setText(String.valueOf(sum));
}
else if(("*").equals((String)v2.lastElement()))
{
sum = sum * d;
tf.setText(String.valueOf(sum));
}
else if(("/").equals((String)v2.lastElement()))
{
sum = sum / d;
tf.setText(String.valueOf(sum));
}
else
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v1.addElement(new String(e.getActionCommand()));
v2.addElement(new String(e.getActionCommand()));
} if(e.getActionCommand()=="-")
{
if
(
("+").equals((String)v1.lastElement())||
("-").equals((String)v1.lastElement())||
("*").equals((String)v1.lastElement())||
("/").equals((String)v1.lastElement())||
("=").equals((String)v1.lastElement())||
("init").equals((String)v1.lastElement())
)
{
tf.setText(tf.getText());
}
else
{
double d = Double.parseDouble(str);
if(("+").equals((String)v2.lastElement()))
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
else if(("-").equals((String)v2.lastElement()))
{
sum = sum - d;
tf.setText(String.valueOf(sum));
}
else if(("*").equals((String)v2.lastElement()))
{
sum = sum * d;
tf.setText(String.valueOf(sum));
}
else if(("/").equals((String)v2.lastElement()))
{
sum = sum / d;
tf.setText(String.valueOf(sum));
}
else
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v1.addElement(new String(e.getActionCommand()));
v2.addElement(new String(e.getActionCommand()));
} if(e.getActionCommand()=="*")
{
if
(
("+").equals((String)v1.lastElement())||
("-").equals((String)v1.lastElement())||
("*").equals((String)v1.lastElement())||
("/").equals((String)v1.lastElement())||
("=").equals((String)v1.lastElement())||
("init").equals((String)v1.lastElement())
)
{
tf.setText(tf.getText());
}
else
{
double d = Double.parseDouble(str);
if(("+").equals((String)v2.lastElement()))
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
else if(("-").equals((String)v2.lastElement()))
{
sum = sum - d;
tf.setText(String.valueOf(sum));
}
else if(("*").equals((String)v2.lastElement()))
{
sum = sum * d;
tf.setText(String.valueOf(sum));
}
else if(("/").equals((String)v2.lastElement()))
{
sum = sum / d;
tf.setText(String.valueOf(sum));
}
else
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v1.addElement(new String(e.getActionCommand()));
v2.addElement(new String(e.getActionCommand()));
} if(e.getActionCommand()=="/")
{
if
(
("+").equals((String)v1.lastElement())||
("-").equals((String)v1.lastElement())||
("*").equals((String)v1.lastElement())||
("/").equals((String)v1.lastElement())||
("=").equals((String)v1.lastElement())||
("init").equals((String)v1.lastElement())
)
{
tf.setText(tf.getText());
}
else
{
double d = Double.parseDouble(str);
if(("+").equals((String)v2.lastElement()))
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
else if(("-").equals((String)v2.lastElement()))
{
sum = sum - d;
tf.setText(String.valueOf(sum));
}
else if(("*").equals((String)v2.lastElement()))
{
sum = sum * d;
tf.setText(String.valueOf(sum));
}
else if(("/").equals((String)v2.lastElement()))
{
sum = sum / d;
tf.setText(String.valueOf(sum));
}
else
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v1.addElement(new String(e.getActionCommand()));
v2.addElement(new String(e.getActionCommand()));
} if(e.getActionCommand()=="=")
{
if
(
("+").equals((String)v1.lastElement())||
("-").equals((String)v1.lastElement())||
("*").equals((String)v1.lastElement())||
("/").equals((String)v1.lastElement())||
("=").equals((String)v1.lastElement())||
("init").equals((String)v1.lastElement())
)
{
tf.setText(tf.getText());
}
else
{
double d = Double.parseDouble(str);
if(("+").equals((String)v2.lastElement()))
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
else if(("-").equals((String)v2.lastElement()))
{
sum = sum - d;
tf.setText(String.valueOf(sum));
}
else if(("*").equals((String)v2.lastElement()))
{
sum = sum * d;
tf.setText(String.valueOf(sum));
}
else if(("/").equals((String)v2.lastElement()))
{
sum = sum / d;
tf.setText(String.valueOf(sum));
}
else
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v1.addElement(new String(e.getActionCommand()));
v2.addElement(new String(e.getActionCommand()));
}
} public static void main(String args[])
{
new CalculaterGUI("Calculater");
}
}测试了一些计算都没什么问题,但是算 21.1-7 得到的结果确是14.100000000000001
可能还有别的算式也会出现类似情况,请问有没有人知道这是什么愿意造成的啊?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;public class CalculaterGUI extends JFrame implements ActionListener
{
JPanel panel = new JPanel();
JTextField tf = new JTextField();
String names[] = {"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};
JButton buttons[] = new JButton[16];
JButton c = new JButton("C");
double sum = 0;
Vector v1 = new Vector(1,1);
Vector v2 = new Vector(1,1);
public CalculaterGUI(String title)
{
super(title); tf.setHorizontalAlignment(JTextField.RIGHT);
tf.setEditable(false);
panel.setLayout(new GridLayout(4,4));
getContentPane().add(tf,BorderLayout.NORTH);
getContentPane().add(panel,BorderLayout.CENTER);
getContentPane().add(c,BorderLayout.EAST);
for(int i=0;i<buttons.length;i++)
{
buttons[i] = new JButton(names[i]);
panel.add(buttons[i]);
} buttons[0].addActionListener(this);
buttons[1].addActionListener(this);
buttons[2].addActionListener(this);
buttons[3].addActionListener(this);
buttons[4].addActionListener(this);
buttons[5].addActionListener(this);
buttons[6].addActionListener(this);
buttons[7].addActionListener(this);
buttons[8].addActionListener(this);
buttons[9].addActionListener(this);
buttons[10].addActionListener(this);
buttons[11].addActionListener(this);
buttons[12].addActionListener(this);
buttons[13].addActionListener(this);
buttons[14].addActionListener(this);
buttons[15].addActionListener(this);
c.addActionListener(this); setSize(230,180);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); v1.addElement(new String("init"));
v2.addElement(new String("init"));
} public void actionPerformed(ActionEvent e)
{
String str = tf.getText(); if(e.getActionCommand()=="C")
{
sum = 0;
tf.setText("");
} if(e.getActionCommand()=="0"||
e.getActionCommand()=="1"||
e.getActionCommand()=="2"||
e.getActionCommand()=="3"||
e.getActionCommand()=="4"||
e.getActionCommand()=="5"||
e.getActionCommand()=="6"||
e.getActionCommand()=="7"||
e.getActionCommand()=="8"||
e.getActionCommand()=="9"||
e.getActionCommand()==".")
{
if(
("+").equals((String)v1.lastElement())||
("-").equals((String)v1.lastElement())||
("*").equals((String)v1.lastElement())||
("/").equals((String)v1.lastElement())||
("init").equals((String)v1.lastElement())
)
{
tf.setText("");
tf.setText(e.getActionCommand());
}
else if(("=").equals((String)v1.lastElement()))
{
sum = 0;
tf.setText("");
tf.setText(e.getActionCommand());
}
else
{
tf.setText(tf.getText() + e.getActionCommand());
}
v1.addElement(new String(e.getActionCommand()));
} if(e.getActionCommand()=="+")
{
if
(
("+").equals((String)v1.lastElement())||
("-").equals((String)v1.lastElement())||
("*").equals((String)v1.lastElement())||
("/").equals((String)v1.lastElement())||
("=").equals((String)v1.lastElement())||
("init").equals((String)v1.lastElement())
)
{
tf.setText(tf.getText());
}
else
{
double d = Double.parseDouble(str);
if(("+").equals((String)v2.lastElement()))
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
else if(("-").equals((String)v2.lastElement()))
{
sum = sum - d;
tf.setText(String.valueOf(sum));
}
else if(("*").equals((String)v2.lastElement()))
{
sum = sum * d;
tf.setText(String.valueOf(sum));
}
else if(("/").equals((String)v2.lastElement()))
{
sum = sum / d;
tf.setText(String.valueOf(sum));
}
else
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v1.addElement(new String(e.getActionCommand()));
v2.addElement(new String(e.getActionCommand()));
} if(e.getActionCommand()=="-")
{
if
(
("+").equals((String)v1.lastElement())||
("-").equals((String)v1.lastElement())||
("*").equals((String)v1.lastElement())||
("/").equals((String)v1.lastElement())||
("=").equals((String)v1.lastElement())||
("init").equals((String)v1.lastElement())
)
{
tf.setText(tf.getText());
}
else
{
double d = Double.parseDouble(str);
if(("+").equals((String)v2.lastElement()))
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
else if(("-").equals((String)v2.lastElement()))
{
sum = sum - d;
tf.setText(String.valueOf(sum));
}
else if(("*").equals((String)v2.lastElement()))
{
sum = sum * d;
tf.setText(String.valueOf(sum));
}
else if(("/").equals((String)v2.lastElement()))
{
sum = sum / d;
tf.setText(String.valueOf(sum));
}
else
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v1.addElement(new String(e.getActionCommand()));
v2.addElement(new String(e.getActionCommand()));
} if(e.getActionCommand()=="*")
{
if
(
("+").equals((String)v1.lastElement())||
("-").equals((String)v1.lastElement())||
("*").equals((String)v1.lastElement())||
("/").equals((String)v1.lastElement())||
("=").equals((String)v1.lastElement())||
("init").equals((String)v1.lastElement())
)
{
tf.setText(tf.getText());
}
else
{
double d = Double.parseDouble(str);
if(("+").equals((String)v2.lastElement()))
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
else if(("-").equals((String)v2.lastElement()))
{
sum = sum - d;
tf.setText(String.valueOf(sum));
}
else if(("*").equals((String)v2.lastElement()))
{
sum = sum * d;
tf.setText(String.valueOf(sum));
}
else if(("/").equals((String)v2.lastElement()))
{
sum = sum / d;
tf.setText(String.valueOf(sum));
}
else
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v1.addElement(new String(e.getActionCommand()));
v2.addElement(new String(e.getActionCommand()));
} if(e.getActionCommand()=="/")
{
if
(
("+").equals((String)v1.lastElement())||
("-").equals((String)v1.lastElement())||
("*").equals((String)v1.lastElement())||
("/").equals((String)v1.lastElement())||
("=").equals((String)v1.lastElement())||
("init").equals((String)v1.lastElement())
)
{
tf.setText(tf.getText());
}
else
{
double d = Double.parseDouble(str);
if(("+").equals((String)v2.lastElement()))
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
else if(("-").equals((String)v2.lastElement()))
{
sum = sum - d;
tf.setText(String.valueOf(sum));
}
else if(("*").equals((String)v2.lastElement()))
{
sum = sum * d;
tf.setText(String.valueOf(sum));
}
else if(("/").equals((String)v2.lastElement()))
{
sum = sum / d;
tf.setText(String.valueOf(sum));
}
else
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v1.addElement(new String(e.getActionCommand()));
v2.addElement(new String(e.getActionCommand()));
} if(e.getActionCommand()=="=")
{
if
(
("+").equals((String)v1.lastElement())||
("-").equals((String)v1.lastElement())||
("*").equals((String)v1.lastElement())||
("/").equals((String)v1.lastElement())||
("=").equals((String)v1.lastElement())||
("init").equals((String)v1.lastElement())
)
{
tf.setText(tf.getText());
}
else
{
double d = Double.parseDouble(str);
if(("+").equals((String)v2.lastElement()))
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
else if(("-").equals((String)v2.lastElement()))
{
sum = sum - d;
tf.setText(String.valueOf(sum));
}
else if(("*").equals((String)v2.lastElement()))
{
sum = sum * d;
tf.setText(String.valueOf(sum));
}
else if(("/").equals((String)v2.lastElement()))
{
sum = sum / d;
tf.setText(String.valueOf(sum));
}
else
{
sum = sum + d;
tf.setText(String.valueOf(sum));
}
}
v1.addElement(new String(e.getActionCommand()));
v2.addElement(new String(e.getActionCommand()));
}
} public static void main(String args[])
{
new CalculaterGUI("Calculater");
}
}测试了一些计算都没什么问题,但是算 21.1-7 得到的结果确是14.100000000000001
可能还有别的算式也会出现类似情况,请问有没有人知道这是什么愿意造成的啊?
http://zh.wikipedia.org/zh/IEEE_754一般來說計算本身都隱含著精度問題,所以自己控制輸出格式,或是使用 BigDecimal。