5

コード:Java floatはdoubleよりも正確ですか?

class Main { 
    public static void main (String[] args) { 
     System.out.print("float: "); 
     System.out.println(1.35f-0.00026f); 
     System.out.print("double: "); 
     System.out.println(1.35-0.00026); 
    } 
} 

出力:

float: 1.34974 
double: 1.3497400000000002 

???浮動小数点は正しい答えを得ましたが、二重はどこからも余分なものを追加しています、なぜですか??

doubleはfloatよりも正確ではないとは思われませんか?

+2

**のSystem.out.println(String.Formatの( "%20F。"、1.35f-0.00026f))、これを試してください。** – lummycoder

答えて

8

floatは4バイト幅ですが、doubleは8バイト幅です。チェックWhat Every Computer Scientist Should Know About Floating-Point Arithmetic

は確かに二重のは、それがわずかに少ない丸め誤差たように、より高い精度を持っています。

無制限に多くの実数を有限数のビットに圧縮する は、おおよその表現を必要とします。無限に 多くの整数がありますが、ほとんどのプログラムでは、整数計算の結果は を32ビットで格納できます。対照的に、任意の固定数のビットが与えられた場合、 ほとんどの実数での計算では、 がその多くのビットを使って正確に表現できない量が生成されます。 したがって、浮動小数点計算の の結果は、しばしば の順番で四捨五入して、その有限表現に戻す必要があります。この丸め誤差は、浮動小数点計算の特徴である です。サイドノートでは

: -

私はあなたの正確な小数点値をしたい場合は、ダブル値を変換するためのルールについて何かを知っている場合は、java.math.BigDecimal

2

を使用することをお勧め からまでの文字列は、のドキュメントで指定されています。Double.toString [Java-API]を使用すると、double値 を最も近い隣から区別するのに十分な最短小数部分が印刷され、 小数点の前後に少なくとも1桁の数字が印刷されます。

チェックジョシュア・ブロックののJavaのpuzzlers:トラップ、落とし穴、コーナーケース - パズル2:変化の時。彼はこの章をこの章で説明します。

3

この理由は、浮動小数点計算による数値のメカニズムです。 javaがfloat値を出力しようとすると、末尾の0が切り捨てられます。 ダブルタイプは8バイトを使用し、フロートは4を使用します。ダブルの方が大きいです。

したがって、javaが浮動小数点値を計算すると、1.3497400のようになり、出力前に切り捨てられます。 そして、Javaが二重の値を計算すると、それはより多くの桁を取得し、そのような結果を得ます。

より良く理解するために、この単純な例を実行してください:

public class Test { 
    public static void main(String[] args) { 
     float sum = 0; 
     for (int i = 1; i <= 10; i++) { 
      sum += 0.1; 
     } 
     System.out.println(sum); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     double sum = 0; 
     for (int i = 1; i <= 10; i++) { 
      sum += 0.1; 
     } 
     System.out.println(sum); 
    } 
} 
関連する問題