2

これは誰にとっても簡単な質問かもしれませんが、「なぜそうなのか」という質問で頭が混乱します。

以下のコードでわかるように、float変数を宣言して値を代入しました。このコードがコンパイルおよび解釈されるとpossible loss of precision、浮動定数の Java インタープリターのデフォルトのデータ型が double であるため、エラーが発生します。

クエリ 1 : float が提供するバイト数に浮動定数が対応できるのに、アプリケーションで double のためにメモリを浪費する必要があるのはなぜでしょうか。

クエリ 2:ここで、指定するfloat a = 3.1415f ;と出力が得られますが、a変数に割り当てられているメモリの量が表示されます。

float a = 3.1415 ;
System.out.println("Value of a:"+a);

このハックを本当に理解したいのですが、なぜそうなのですか?

4

5 に答える 5

1

「クエリ 1 : float が提供するバイト数に浮動定数を格納できるのに、なぜ double のためにアプリケーションでメモリを浪費する必要があるのだろうか。」

これには誤った仮定が組み込まれています。float も double も実際に値を格納することはできません:

float: 3.141499996185302734375
double: 3.141500000000000181188397618825547397136688232421875

どちらも概算ですが、double は float よりもはるかに近い概算です。

リテラルに必要な精度について考えない場合は、double を使用する方が安全であり、適切なデフォルトになります。float の丸め誤差の影響を分析し、float を許容できると判断した場合は、float リテラルにすることができ、またそうする必要があります。

于 2013-08-23T01:50:06.560 に答える
0

質問で答えさせてください:

このコードの小さな断片がtrueではなくfalseを出力するのはなぜですか?

float a = 3.1415;
double b = 3.1415;
double c = a;
System.out.println((b==c));

... とった?まさに!

ただし、これがロジック全体ではないことは事実です。0.1f と 0.1 はバイナリ表現では異なる数値ですが、0.5f と 0.5 は同じであるため、コンパイラは float f = 0.5; を宣言できるようにする必要があります。ただし、各数値が浮動小数点数に「収まる」か、精度を失うことなく double を必要とするかどうかは評価しません。大部分の数値で精度が失われると想定しているだけであり、当然のことです。

于 2013-08-23T15:25:03.347 に答える