これで、float.Parseのメソッドを使用することがわかりましたが、問題が発生しました。
文字列「36.360」を解析していますが、解析されたフロートは36.3600006103516になります。
小数点以下3桁に四捨五入しても安全ですか、それとも文字列からフロートを解析するためのより良い戦術がありますか。
明らかに、解析されたフロートが36.360になるように探しています。
これは構文解析とは関係ありませんが、浮動小数点数に固有の「機能」です。正確な10進数表現を持つ多くの数値は、浮動小数点数として正確に格納できないため、このような不等式が発生します。
ウィキペディア(ウェブ上の多くの記事)が問題を説明しています。
浮動小数点数は本質的に丸め誤差を起こしやすいです。CPUアーキテクチャが異なっていても、小数点以下100万分の1以上で異なる数値が得られます。これは、浮動小数点数を比較するときに使用できない理由でもあります==
。浮動小数点の精度エラーのために、それらが等しいと評価されることはめったにありません。
浮動小数点数の精度には限界があります。詳細については、このリンクを確認してください。
より正確な追跡が必要な場合は、double
またはdecimal
タイプなどの使用を検討してください。
これは、メモリから値を読み取ることが数学的なプロセスであるように、float
または両方が格納されているという事実によるものです。double
値を実際の値として保存する場合は、より適切な選択になりますdecimal
。
System.DecimalのMSDNページによると:
10進値タイプは、多数の重要な整数および小数桁を必要とし、丸め誤差がない財務計算に適しています。Decimalタイプは、丸めの必要性を排除しません。むしろ、丸めによるエラーを最小限に抑えます。
これはまったく奇妙な問題ではありません。これは、常に遭遇するフロートの魅力的な機能の1つにすぎません。floatは、そのような10進値を正確に表現できません。
したがって、結果を正確に36.36にする必要がある場合は、decimal
ではなくを使用してfloat
ください。
それ以外の場合は、自由に四捨五入できます。ただし、丸め後も正確に36.36になることはないため、丸めは役に立ちません。