2

この形式で浮動小数点数を宣言して初期化することは合法であり、慣習的であるという印象を受けました。

float someVariable = 12.502D;  (or M, F does not give a compiler error).

ただし、コンパイラ エラーが発生します。

double 型のリテラルは、'float' 型に暗黙的に変換することはできません。このタイプのリテラルを作成するには、接尾辞「F」を使用します。

C# には 3 種類の浮動小数点数がありますね。

  1. フロートの場合は F または f。(有効数字7桁)
  2. Double の場合は D または d。(有効数字15桁または16桁)
  3. M または 10 進数の m。(有効数字 28 桁または 29 桁)

コンパイラ エラーを修正するために、割り当てステートメントを明示的にキャストしました。

float SomeVariable = (float) 12.525D;

この場合、私は正しいことをしましたか?Double または Decimal 値で構成される浮動小数点変数を宣言および初期化する従来の方法または正しい方法は何ですか?

4

3 に答える 3

7

平易な英語では、テキスト文字列 12.502 に対してコンパイラが想定するデフォルトの型は double です。double は float の 2 倍のサイズであり、クォートが 1 パイントに収まらないのと同様に、キャストを行わない限り double を float に格納することはできず、精度が失われる危険があります。

次のように F または f サフィックスを追加することで、12.502 が実際には float であることをコンパイラに伝えることができます。

float someVariable = 12.502f;

または:

double someVariable = 12.502;
于 2013-01-12T09:23:29.727 に答える
1

使用しない理由:

float someVariable = 12.502f;

また

double someVariable = 12.502; //floating point literals are by default doubles

floatは単精度浮動小数点演算でありdouble、C# で暗黙的に変換することはできません。C# では、一部の情報が失われる可能性があるすべてのキャストを暗黙的にすることはできません。float浮動精度のコンポーネントを格納するための 32 ビットがあります。doubleは 64 ビットです。

float1.5 × 10^-45からまでの値を取ることができます3.4 × 10^38

double5.0 × 10^-324からまでの値を取ることができます 1.7 × 10^308

したがって、double ははるかに広い範囲の値を格納できることがわかります。したがって、 からdoubleに変換すると、float情報が失われる可能性があります。

于 2013-01-12T09:20:21.923 に答える
0

と書くfloat SomeVariable = (float) 12.525D;と、10 進数は最初に double に変換され、次に float に変換されます。まれに、数値によっては、この二重の丸めによって値がわずかに変化します。

F サフィックスを付けて数字を書くと、これを回避できます。

(数値が何らかの意味で一様に分布している場合、これは 2 30に約 1 回発生します。これは、二重仮数よりも浮動小数点仮数の方が 29 ビット少ないためです。問題は、元の数値が倍精度で正確に丸められるときに発生します。浮動小数点丸めの中間点 [2 29に 1 回] ですが、直接浮動小数点に丸める場合は、その中間点が [2 に 1 回] に丸められるところから反対方向に丸めます。)

于 2013-01-12T10:24:03.073 に答える