C# での出力の Double の書式設定
最近の実験では、C# で C の出力書式設定機能をエミュレートする試みが行われました。ただし、予想される出力と実際の出力の間に不一致が観察されました。
C コード:
double i = 10 * 0.69; printf("%f\n", i); printf(" %.20f\n", i); printf("+ %.20f\n", 6.9 - i); printf("= %.20f\n", 6.9);
は次の出力を生成しました:
6.900000 6.89999999999999946709 + 0.00000000000000088818 = 6.90000000000000035527
C# code:
double i = 10 * 0.69; Console.WriteLine(i); Console.WriteLine(String.Format(" {0:F20}", i)); Console.WriteLine(String.Format("+ {0:F20}", 6.9 - i)); Console.WriteLine(String.Format("= {0:F20}", 6.9));
yielded:
6.9 6.90000000000000000000 + 0.00000000000000088818 = 6.90000000000000000000
デバッガーでは i が 6.89999999999999946709 と表示されているにもかかわらず、C# の書式設定では、形式を適用する前に値が有効な 10 進数 15 桁に丸められます。
この予期しない動作の理由は、 .NET は内部的にバイナリ表現を使用して double を格納します。フォーマットする前に、.NET は double を 10 進数の文字列に変換します。これにより本質的に丸め誤差が生じます。
この問題を回避するには、次のいずれかを行うことができます。
DoubleConverter の使用例:
Console.WriteLine(DoubleConverter.ToExactString(i)); Console.WriteLine(DoubleConverter.ToExactString(6.9 - i)); Console.WriteLine(DoubleConverter.ToExactString(6.9)); // 6.89999999999999946709294817992486059665679931640625 // 0.00000000000000088817841970012523233890533447265625 // 6.9000000000000003552713678800500929355621337890625
以上がDouble をフォーマットするときに C# と C で異なる出力が生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。