浮動小数点問題

Javaのプログラムにフレーム経由で整数値と実数の値を渡すとする。

double double3 = Double.parseDouble(tf03.getText());

のようにして、テキストフィールド tg03に入力された文字列を Double.parseDouble関数にて Double 型数値にするような処理をして、それを数値として計算し、その結果を出力すると、その出力結果は、0.03のはずが、0.3000000000000003 のようになる。これは、10進数の0.1が、計算機の中では2進数表示され、その場合に、0.0001100110011001100....というような1100の無限循環小数として取り扱われるからである。

実際には、以下のサンプルを用いて実行してみるとわかる。
Javaソースサンプル

	import java.awt.*;
	import java.awt.event.*;
	import javax.swing.*;
	import java.lang.Object;
	public class InputFrame extends JFrame{
	    JTextField tf01=new JTextField("",4);
	    JTextField tf02=new JTextField("",4);
	    JTextField tf03=new JTextField("",4);
	    JTextField tf04=new JTextField("",4);
	    JTextField tf05=new JTextField("",4);
	    JTextField tf06=new JTextField("",4);
	    JLabel lb01=new JLabel("整数を入力");
	    JLabel lb02=new JLabel("整数を入力");
	    JLabel lb03=new JLabel("有理数を入力");
	    JLabel lb04=new JLabel("整数を入力");
	    JLabel lb05=new JLabel("有理数を入力");
	    JLabel lb06=new JLabel("有理数を入力");

        JButton b01=new JButton("和を求める");
	    
	    public static void main(String ar[]){
	    	InputFrame sample = new InputFrame();
	    }
	    
	    public InputFrame(){
	        // フレームを作成
	        JFrame f=new JFrame("Input parameters");
	        f.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
	        
	        
	        b01.setActionCommand("Apply & Run");
	        b01.addActionListener(new PushButtonActionListener(f));
	        
	        
	        JPanel p1=new JPanel();
	        p1.add(lb01);
	        p1.add(tf01);
	        f.getContentPane().add(p1);
	        JPanel p2=new JPanel();
	        p2.add(lb02);
	        p2.add(tf02);
	        f.getContentPane().add(p2);
	        JPanel p3=new JPanel();
	        p3.add(lb03);
	        p3.add(tf03);
	        f.getContentPane().add(p3);
	        JPanel p4=new JPanel();
	        p4.add(lb04);
	        p4.add(tf04);
	        f.getContentPane().add(p4);
	        JPanel p5=new JPanel();
	        p5.add(lb05);
	        p5.add(tf05);
	        f.getContentPane().add(p5);
	        JPanel p6=new JPanel();
	        p6.add(lb06);
	        p6.add(tf06);
	        f.getContentPane().add(p6);
	        JPanel pb=new JPanel();
	        pb.add(b01);
	        
	        f.getContentPane().add(pb);
	        
	        f.setLocation(10, 10);
	        f.setSize(150,400);
	        f.setVisible(true);
	    }
	    
	    private class PushButtonActionListener implements 
ActionListener{
	        JFrame f = null;
	        public PushButtonActionListener(JFrame af) {
	               this.f = af;
	        }
	        public void actionPerformed(ActionEvent ae){
	            
	            if(ae.getActionCommand()=="Apply & Run"){
	            	int int1 = Integer.parseInt(tf01.getText());
	            	int int2 = Integer.parseInt(tf02.getText());
	            	double double3 = Double.parseDouble(tf03.getText
());
	            	int int4 = Integer.parseInt(tf04.getText());
	            	double double5 = Double.parseDouble(tf05.getText
());
	            	double double6 = Double.parseDouble(tf06.getText
());
	            	double ans = int1 + int2 + double3 + int4 + 
double5 + double6;
	            	String ansSt = "" + ans;
	                
	                    ErrDialog dia=new ErrDialog(this.f,"Error 
Message",ansSt);
	                    return;
	                
	                
	            }
	        }    
	    }
	    
	    class ErrDialog extends JDialog{
	        ErrDialog(Frame f,String title,String msg) {
	            
	            JDialog dia = new JDialog(f, title, true);
	            
	            JLabel lab = new JLabel(msg);
	            dia.getContentPane().add(BorderLayout.NORTH, lab);
	            
	            dia.setLocation(10, 10);
	            dia.setSize(200, 100);
	            dia.setVisible(true);
	        }
	    }
	}