2016-09-16 6 views
2

3つの実数の値を宣言し、それぞれの値を以下のコードと比較しようとしました。最初の比較(d==f)においてdouble型の値の比較

public class Main { 
    public static void main(String[] args) { 
     float f = 0.1f; 
     double d= 0.1; 
     double d2 = (double)f; 

     System.out.println(d); 
     System.out.println(d2); 
     System.out.println(); 

     System.out.println(d==f); 
     System.out.println(d==d2); 
     System.out.println(d2==f); 
    } 
} 

dfはfloat型であるため、コンパイラはダブル型に可変fを変え、一方double型であるからです。これは、fに格納されている値がdouble型の値に再割り当てされることを意味します。したがって、この比較はfalseを返します。また、d==d2比較が実行され、最初の比較で同じ方法でfalseが返されます。

ただし、最後の比較d2==fはtrueを返します。変数fがdouble型の値に再割り当てされ、d2fに格納されている値が少し違うので、私はfalseを返すと予想しました。しかし、結果は真です。

第3の比較が真実を示した理由を説明できますか?

+0

'System.out.println((float)d == f);と' System.out.println((float)d == d2);のように最初の2つを変更すると、 「本当」でも。 –

答えて

0

あなたが言ったようにdoublefloatを比較するとき、floatdoubleにキャストされます。

そこで、そのコンテキストで変数に何が起こっているのかを考えてみましょう。

d2は、floatからキャストされたdoubleであり、fはdoubleにキャストされるfloatです。

両方とも同じタイプから同じタイプに同じタイプでキャストされているので、キャストの仕組みは実際には問題にならず、どちらも同じことを評価します。

+0

それは逆で、float 'f2'が二重' d'から割り当てられた場合はどうなりますか? –

0

0.1は、バイナリで表現されたときの繰り返し番号です。

doublefloatよりも高い精度を持っているので、フロートにdoubleから変換するとき、あなたは情報を失うが、 `doubleにfloatから変換するとき、あなたは情報を失うことはありません。

A float has 24 bits of precision, while a double has 53 bits(マイナス記号に対して1つ)

d2fから来ているので、d2f両方が精度の23ビットを持っているが、dは依然として精度の52ビットを有します。

+0

これは非常に疑わしいことです。浮動小数点から二重への変換が正確な損失をもたらさないというのは技術的には正しいですが、 '.001f'の内部表現が実際には' .001102'であるという事実は無視されます。だから '(double).01f'は' .01'をdoubleとして返さないかもしれません。これは私の意見であなたの答えを少し誤解させる。私が言っていることの証拠については、この質問を参照してください:http://stackoverflow.com/questions/916081/convert-float-to-double-without-losing-precision – nhouser9

+0

@ nhouser9 '.001f'の内部表現は、 「2」がないので、「.001102」になります。 –

+0

は関係ありません。ポイントは、フロートが内部的に格納される方法を無視したため、答えが誤解を招くことです。 – nhouser9