ホームページ >バックエンド開発 >C++ >C# で「i = 10 * 0.69;」の結果が 6.9 ではなく 6.8999999999999995 になるのはなぜですか?

C# で「i = 10 * 0.69;」の結果が 6.9 ではなく 6.8999999999999995 になるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-10 08:57:41150ブラウズ

Why Does `i = 10 * 0.69;` in C# Result in 6.8999999999999995 Instead of 6.9?

.NET 浮動小数点演算と精度の問題

C# では、ステートメント i = 10 * 0.69; は、予想される 6.8999999999999995 ではなく、驚くべきことに 6.9 という結果になります。これは、.NET フレームワーク内の浮動小数点数表現と演算に固有の制限に起因します。

0.69 のような 10 進数値は 2 進数で完全に表現できるという誤解があります。 ただし、浮動小数点数 (doublefloat など) は 2 進法を使用しており、有限の 10 進数の桁数で 1/3 を正確に表現できないのと同様に、多くの小数部を 2 進数で正確に表現することはできません。コンパイラはコンパイル中に結果を計算して定数として保存しますが、この保存された値は真の数学的結果の近似値です。

この精度の問題に対処するために、いくつかのソリューションが存在します。

  • decimal データ型を使用します。 decimal は精度が高く、6.9 を正確に表現できます。 ただし、decimal を使用すると、doublefloat に比べてパフォーマンスが若干低下する可能性があります。
  • 丸めの実装: Math.Round() のような関数や NumberFormatInfo を使用した文字列書式設定を使用すると、結果を目的の精度レベルに丸めることができます。
  • 値の調整: 潜在的な丸め誤差を補正するために、入力値をわずかに調整できます。ただし、このアプローチでは複雑さが増し、新たな不正確さが生じる可能性があります。

浮動小数点演算の制限を理解することは、堅牢で正確な数値コードを作成するために不可欠です。適切な手法を利用することで、開発者はこれらの精度制限の影響を最小限に抑え、信頼性の高い数学的演算を保証できます。

以上がC# で「i = 10 * 0.69;」の結果が 6.9 ではなく 6.8999999999999995 になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。