0

値 0.1 を float に割り当てると:

float f = 0.1;

0.1 は単精度浮動小数点形式で正確に表現できる数値ではないため、メモリに格納される実際の値は 0.1 の正確な表現ではありません。格納されている実際の値は、計算を正しく行った場合です。

0.100000001490116119384765625

しかし、C# でその値を出力する方法を特定できません。数値を小数点以下の桁数まで出力するように依頼しても、正しい答えは得られません。

// prints 0.10000000000000000000000000000000000000000000000000
Console.WriteLine(f.ToString("F50"));

float に格納されている正確な値を出力するにはどうすればよいですか。メモリ内のビットパターンによって実際に表される値?

編集:他の場所で、.NET Core および .NET 5.0 で標準の書式文字列を使用して、私が求める動作を得ることができることに注意を向けました。したがって、この質問は .NET Framework 固有のものだと思います。

4

3 に答える 3

0

おっと、この回答は C# ではなく C に関するものです。

言語にはこれに関する類似点があるため、C#の洞察を提供する可能性があるため、そのままにしておきます。


float に格納されている正確な値を出力するにはどうすればよいですか?

// Print exact value with a hexadecimal significant.
printf("%a\n", some_float);
// e.g. 0x1.99999ap-4 for 0.1f

a の値をfloat10 進数で表示するには、他のすべての と十分に区別できる小数点以下の桁数を指定しますfloat

int digits_after_the_decimal_point = FLT_DECIMAL_DIG - 1;  // e.g. 9 -1
printf("%.*e\n", digits_after_the_decimal_point, some_float);
// e.g. 1.00000001e-01 for 0.1f

すべての小数点以下の桁数で値を 10 進数で出力するのは難しく、ほとんど必要ありません。コードはより高い精度を使用できます。特定のポイント (たとえば、有効桁数 20 桁)big_valueを超えると、下位桁の正確性が失われる可能性がありprintf()ます。この誤りは、C およびIEEE 754で許容されます。

int big_value = 19; // More may be a problem.
printf("%.*e\n", big_value, some_float);
// e.g. 1.0000000149011611938e-01 for 0.1f
// for FLT_TRUE_MIN and big_value = 50, not quite right
// e.g. 1.40129846432481707092372958328991613128026200000000e-45

all のすべての小数点以下の桁数で値を 10 進数で出力するfloatには、ヘルパー関数を記述します。

// Using custom code
// -FLT_TRUE_MIN 
-0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125
于 2021-08-30T15:23:39.077 に答える
-3

次のように、float の代わりに decimal を使用する必要があります。

decimal f = 0.1m;

0.1 のみを出力します。

float、double、decimalの違いについては、この回答を確認できます

.NETでの10進数、浮動小数点、倍精度の違いは?

于 2021-08-28T19:42:14.893 に答える