浮動小数点問題
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); } } }