2012-03-22 4 views
1

私は、条件に基づいてファイルからいくつかの入力価格を追加して2つの倍数を生成するプログラムを持っています。Javaプログラムのdouble numberのシステム出力

String str; 
double one = 0.00; 
double two = 0.00; 
BufferedReader in = new BufferedReader(new FileReader(myFile)); 

while((str = in.readLine()) != null){ 
    if(str.charAt(21) == '1'){ 
     one += Double.parseDouble(str.substring(38, 49) + "." + str.substring(49, 51)); 
    } 

    else{ 
     two += Double.parseDouble(str.substring(38, 49) + "." + str.substring(49, 51)); 
    } 
    } 

in.close(); 
System.out.println("One: " + one); 
System.out.println("Two: " + two);  

出力は似ている:

One: 2773554.02 
Two: 6.302505836000001E7 

質問:

は、入力のいずれもが、その中に3つ以上の小数点以下を持っていません。 1と2の計算方法がまったく同じになります。

なぜ出力形式がこのようなのですか?

私は何を期待しています:

One: 2773554.02 
Two: 63025058.36 

なぜ印刷は、二つの異なるフォーマットでありますか?私はファイルに出力を書きたいので、小数点以下2桁しかなければなりません。

+6

使用 'DecimalFormat' - 例えばhttp://stackoverflow.com/questions/50532/how-do-iを-format-a-number-in-java – scibuff

+3

また、倍精度解析で導入された丸め誤差を避けるために、 'double'の代わりに' BigDecimal'を使用します(これは2番目の数値の最後に00000001が表示される理由です) – beny23

+0

As常に:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html - 非常に価値のある読書。 – mcfinnigan

答えて

1

精度がのの問題は、doubleを使用することによって発生します。これを避けるにはBigDecimalを使用してください。印刷用

、このようDecimalFormatを使用する:のDecimalFormatのため

DecimalFormat format = new DecimalFormat("0.##"); 
System.out.println("One: " + format.format(one)); 
System.out.println("Two: " + format.format(two)); 

ドキュメント:http://docs.oracle.com/javase/1.4.2/docs/api/java/text/DecimalFormat.html

関連する問題