ホームページ > バックエンド開発 > C++ > Double をフォーマットするときに C# と C で異なる出力が生成されるのはなぜですか?

Double をフォーマットするときに C# と C で異なる出力が生成されるのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-04 19:27:44
オリジナル
408 人が閲覧しました

Why Do C# and C Produce Different Output When Formatting Doubles?

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 進数の文字列に変換します。これにより本質的に丸め誤差が生じます。

この問題を回避するには、次のいずれかを行うことができます。

  • 正確な 10 進数にアクセスするdouble の値: 内部バイナリ ビットを抽出して 10 進数値の文字列表現を構築します
  • カスタム書式設定ライブラリを使用します。 Jon Skeet の DoubleConverter クラスを利用します。このクラスは、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート