• 締切済み

Javaの計算結果がおかしい

javaの勉強をしていますが、以下のプログラム(double型の配列データを全件合計)を実行するとおかしな結果になります。 どなたか、理由をご教示願いただきたく。 package exec; public class Error { public static void main(String[] args) { double[] data = {12.3,12.2,12.3,13.0,12.8,13.0}; double total = 0.0; for (double dd : data){ total += dd; System.out.println(total); } } } 実行結果は、次のように正しくありません。 12.3 24.5 37.5 50.3 62.599999999999994 75.6 ちなみに、double[] data = {12.3,12.2,13.0,12.8,13.0,12.3}; のように2つめの12.3を最後にすると 12.3 24.5 37.5 50.3 63.3 75.6 と正しい集計をします。 環境はWindows7(64bit)、Eclipse 3.7(junoでも同じ結果)、JDK1.7 です。 以上、よろしくお願いいたします。

noname#176432
noname#176432
  • Java
  • 回答数3
  • ありがとう数4

みんなの回答

回答No.3

おなじみの話題ですが、浮動小数点に関して学習した方がよいでしょう。 正しい動作であり、Javaの問題ではありません。

noname#176432
質問者

お礼

ありがとうございます。 お礼が遅くなり申し訳ありません。 2進法の誤差と理解しました。

  • teketon
  • ベストアンサー率65% (141/215)
回答No.2

尋ねている部分はどちらでしょうか? 実行した所、提示されている値ではなく、 > 12.3 > 24.5 > 37.5 > 50.3 > 62.599999999999994 > 75.6 下記のように表示されました。 > 12.3 > 24.5 > 36.8 > 49.8 > 62.599999999999994 > 75.6 たしかにおかしいですが、実行結果と例が違っていませんか? > 62.599999999999994 が62.56にならないということでしょうか? これは浮動小数点の計算による誤差です。 10進数と2進数での表記方法の違いにより生じます。 安易な解決方法としては、BigDecimalを使用してください。

noname#176432
質問者

お礼

お礼が遅くなり申し訳ありません。 ありがとうございます。 BigDecimalを使うということが初心者にはわかりませんでした。BigDecimalで当該数字をcharでセットする方法があることも知りました。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

浮動小数点数の誤差のせいではないかと思います。

noname#176432
質問者

お礼

お礼が遅くなり申し訳ありません。 有難うございます。 小数点を取り扱うときには、誤差に注意します。

関連するQ&A

  • javaのdoubleでの計算による誤差

    宜しくお願いします。 割り算でなくても、足し算の小数点計算で誤差がでます。 public class keisan { public static void main(String[] args) { double a1 = 12.3; double b1 = 45.6; System.out.println(a1 + b1); } } 結果が 57.900000000000006 となります。 きっちり57.9とならないのはなぜでしょう? 他の数字でも数が小数点以下でブレます。 原因に何が考えられるでしょうか? OSはWindowsXP pro ver.2002 SP3 32bit jdk 1.6.0_17 eclipseは Eclipse Platform Version: 3.5.2.R35x_v20100210-0800-9hEiFzmFst-TiEn9hNYgDWg1XN8ulH_JvCNGB Build id: M20100211-1343 を使っています。

    • ベストアンサー
    • Java
  • javaの問題わからなくって質問します

    内容はEclipse上でプロジェクトフォルダを作りひとつは別のjavaファイルを動かすのともう一つはそのお同じフォルダから動かされるjavaプログラムです。 説明不足というかまだ触れてそんなにたってないのでソースを載せます class SampleManager { public static void main(String[] args){ exec obj= new exec(samlple1.java); obj.say(); } } class exec{ String phrase; exec(String phrase){ this.phrase=sample2.java; } void say(){ System.out.println(phrase); } } /////// public class samlple1 { public static String java; public static void exec(String[] args) {//execをした理由はSampleManagerにあるクラスexecを呼び出れるため System.out.println("Hello,World!")//この二つの出力結果を表示したい; System.out.println("こんにちは!"); } } ひとつのフォルダに上記のソースいれてSampleManager.java からsample.javaの出力結果の HelloWorld! こんにちは! を出力したいですがエラーはなく例外処理もありませんけど何故か出力結果はnullが返ってしまいます なぜでしょうか? アドバイスをお願いします

  • javaが実行されない

    雑誌を買ってjavaでプログラミングをしているのですが なぜか実行できません。 ツールはteraPadとJDKを使っています。 public class sample { public static void main(String[] args) { System.out.println("hello!"); } } コンパイルし、classファイルを実行すると Exception in thread "main" java.lang.NoClassDefFoundError: sample/class と出て実行できません。結果はhello!となるはずなのですがどなたかどこがおかしいのか教えてください。

    • ベストアンサー
    • Java
  • Javaで外部コマンドの実行した結果の取得

    Javaで外部コマンドを実行してその結果を取得しようとしてEclipse上で 下記サンプルを作成しました。ここで不思議なことが起きました。 下記を実行すると System.out.println(in.ready()) の部分でfalseが返り処理がwhileループの中に入らない状態です。 しかし、System.out.println(in.ready())の部分にブレークポイントを付けて1行ずつ実行していくと trueが返りwhileループの中の結果を読み取る処理にたどり着きます。 これはどういうことでしょうか。 public class Test { public static void main(String[] args) { String command = "hostname"; try { Process process = Runtime.getRuntime().exec(command); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); System.out.println(in.ready());             while(in.ready()) { } in.close(); } catch(Exception e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • java 実行できない

    javaで public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!"); } } のようなプログラムをかいて、コンパイルして、実行しようとすると エラー: メイン・メソッドがクラスStringで見つかりません。次のようにメイン・メソッドを定義してください。 public static void main(String[] args) またはJavaFXアプリケーション・クラスはjavafx.application.Applicationを拡張する必要がありま というエラーがでます。コンパイルはできます。jdkは1.8.0_25を使っています。

  • Eclipseで実行>Javaアプリケーションが表示されない

    Eclipseでソースを書いたところ、 右クリック>実行>でJavaアプリケーションが表示されませんでした。 他のソースはJavaアプリケーションが表示されて実行が出来ます。 どうしたら実行できるようになるのでしょうか? 前に行った操作で、原因として考えられるのは、 インポートからファイルシステムでソースをインポートしたぐらいです。 どなたか回答宜しくお願いします。 ~~~~以下がそのソースです。~~~~~~~ package selfJava; public class P78_2_9_2 { /** * @param args * @param */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ double i, j; if(args.length != 2){ System.out.println("引数を二つにしてください"); } for(int k = 0, k < args.length; k++){ if(Character.isDigit(args[0])){ }else{ System.out.println("数値を入力してください"); } } i = Integer.parseInt(args[0]); j = Integer.parseInt(args[1]); System.out.println("args[0] × args[1] =" + i * j); } }

  • ダブルクォートがエスケープできない

    public static final String HOGE = "¥"hogehoge¥""; public static void main(String[] args){ System.out.println(HOGE); } eclipseで上記のようなコードがエラー表示されます。しかし実行はできます。 実行結果:"hogehoge" エラー表示を取る事は出来ますか? よろしくお願いします 環境 mac osx eclipse 4.2 java 1.6

    • ベストアンサー
    • Java
  • 実行結果が1つしか出ない。

    いつも教えてくださり有難うございます。 Sample3 ↓ →JREシステム・ライブラリー src ↓ (デフォルト・パッケージ)   ↓ Sample3.java public static void main (String[] args) { System.out.println(1+1); System.out.println(1+1+2); } 実行結果が2は出るのですが 4が出ません。 どうしてでしょうか? ご回答のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • Javaコンパイルエラー

    Javaにて以下のようなプログラムを作成していますが、 「演算子 ^ は引数の型 double, int で未定義です。」とエラーになりました。 色々な方のご協力もあり、ここまで作れましたが、 これより先が行き詰っています。 教えていただけないでしょうか。 ---------------------------------------------- // 分散を返すメソッド public class Kadai16 { public static void main(String args[]){ //double型の配列の生成 double[]a=new double[10]; argument(a); //配列aの要素[0]から[9]の内容を表示 System.out.println(a[0]); System.out.println(a[1]); System.out.println(a[2]); System.out.println(a[3]); System.out.println(a[4]); System.out.println(a[5]); System.out.println(a[6]); System.out.println(a[7]); System.out.println(a[8]); System.out.println(a[9]); //double total=sum(a)を実行する double total =sum(a); System.out.println("合計は"+total+"です。"); //使って平均を出す double heikin; mean(total); heikin = mean(total); System.out.println("平均は"+heikin+"です。"); //分散を返す double bunsan; bunsan = total-heikin^2/10; System.out.println("分散は"+bunsan+"です。"); } /** * ランダムな数値を入れるメソッド * @param a ランダムな数値を入れる配列 */ private static void argument(double[]a) { //引数の配列aの[0]から[9]までランダムな数値を設定する。 for(int i=0; i<a.length;i++) { a[i]=Math.floor(Math.random()*10); } } //配列を受け取って要素の合計を出すメソッド public static double sum(double[] x) { double t=0; for(int i=0; i<x.length;i++) { t= x[i]+t; } return t; } //配列を受け取って平均を出すメソッド public static double mean(double b) { return b/10; } //分散を返すメソッド public static double bunsan(double c) { double t=0; double bnsan =0; for(int i=0; i<c.length; i++) { t =c[i]+t } } }

  • JavaのDateクラスについて教えてください.

    下のプログラムを実行すると, Date : Mon Jan 30 15:30:00 JST 2006 となります. 私としては,Apr となることを期待するのですが, おかしいでしょうか? Javaの環境は,jdk1.5.0_05 です. // ここから import java.text.SimpleDateFormat; import java.util.Date; public class DateTest { public static void main(String[] args) throws Exception { String dateStr = "2006/04/30 15:30"; Date date = new SimpleDateFormat("yyyy/MM/DD HH:mm").parse(dateStr); System.err.println("Date : " + date); } }