4

float varr = 123456789;変数のvarr値が期待どおりでは123456792.0ないように、大きな数値をfloatに格納しようとすると123456789.0。なんで?

これに対する解決策はありますか?

メモリ内のバイト数が4バイトに制限されているため、doubleまたはdecimalを使用できません。

4

4 に答える 4

1

これは、float 変数の精度が限られているためです。代わりに double を使用してください。

ここでわかるように、float の精度は 7 桁のみですが、double の精度は 13 です

4 バイトのメモリを使用すると、約を表すことができます。40 億の異なる値、つまり 9 桁の 10 進数。表示する数値がその範囲に収まるかどうかを自問する必要があります。たとえば、0 から 999 999 999 までの数値を格納する場合、4 バイトで十分です。1 000 000 000 から 1 999 999 999 までの番号があれば、それで十分です。この場合、1 000 000 000 を引いて、入力数値 (double) を整数に変換する必要があります。値を読み取るときに、逆を実行できます。

この原則を拡張して、他の範囲の数値や、より精度の低い範囲を表示することができます。ただし、自分で変換をコーディングする必要があります。

于 2012-04-11T09:14:19.580 に答える
1

さらに精度が必要な場合は、doubleまたはdecimalを使用できます。
とにかく、浮動小数点数は常に概算であることを覚えておいてください。

于 2012-04-11T09:14:56.873 に答える
0

32ビット整数(4バイト)で整数()を使用できる場合はint、その数値を格納でき、精度の問題は発生しません。

于 2012-04-11T10:26:29.800 に答える
0

型の精度は、floatこの制限を意味します。double代わりに typeを使用できます。

floatC# の型は、IEEE 754-2008 binary32 形式 (単精度浮動小数点形式)に準拠しています。

ウィキペディアから:

IEEE 754 標準では、binary32 が次のように指定されています。

  • 符号ビット: 1 ビット
  • 指数幅: 8 ビット
  • 有効桁数の精度: 24 (明示的に格納された 23)

これにより、10 進数の有効桁数が 6 ~ 9 桁になります (10 進数の有効桁数が最大 6 桁の 10 進文字列が IEEE 754 単精度に変換され、次に同じ有効桁数に変換された場合、最終的な文字列は元の文字列と一致する必要があります。また、 IEEE 754 の単精度が 9 桁以上の有効桁数を持つ 10 進文字列に変換されてから単精度に戻される場合、最終的な数値は元の数値と一致する必要があります)。

符号ビットは、仮数の符号でもある数値の符号を決定します。指数は、-128 ~ 127 (2 の補数) の 8 ビットの符号付き整数、または IEEE 754 binary32 定義で受け入れられているバイアス形式である 0 ~ 255 の 8 ビットの符号なし整数のいずれかです。この場合、指数値 127 は実際のゼロを表します。真の仮数には、2 進小数点の右側にある 23 の小数ビットと、指数がすべてゼロで格納されていない限り、値が 1 の暗黙的な先行ビット (2 進小数点の左側) が含まれます。したがって、仮数部の 23 ビットのみがメモリ形式に表示されますが、合計精度は 24 ビットです (log10(224) ≈ 7.225 10 進数に相当)。

ところで、私はあなたの結果を得ません。私はこのコードを実行します:

float varr = 123456789;
Console.WriteLine(varr.ToString("#"));

そして私の出力は123456800.

于 2012-04-11T09:32:41.940 に答える