-1

これで、float.Parseのメソッドを使用することがわかりましたが、問題が発生しました。

文字列「36.360」を解析していますが、解析されたフロートは36.3600006103516になります。

小数点以下3桁に四捨五入しても安全ですか、それとも文字列からフロートを解析するためのより良い戦術がありますか。

明らかに、解析されたフロートが36.360になるように探しています。

4

5 に答える 5

3

これは構文解析とは関係ありませんが、浮動小数点数に固有の「機能」です。正確な10進数表現を持つ多くの数値は、浮動小数点数として正確に格納できないため、このような不等式が発生します。

ウィキペディア(ウェブ上の多くの記事)が問題を説明しています。

于 2012-04-09T14:04:40.597 に答える
2

浮動小数点数は本質的に丸め誤差を起こしやすいです。CPUアーキテクチャが異なっていても、小数点以下100万分の1以上で異なる数値が得られます。これは、浮動小数点数を比較するときに使用できない理由でもあります==。浮動小数点の精度エラーのために、それらが等しいと評価されることはめったにありません。

于 2012-04-09T14:05:59.250 に答える
1

浮動小数点数の精度には限界があります。詳細については、このリンクを確認してください。

より正確な追跡が必要な場合は、doubleまたはdecimalタイプなどの使用を検討してください。

于 2012-04-09T14:06:46.167 に答える
1

これは、メモリから値を読み取ることが数学的なプロセスであるように、floatまたは両方が格納されているという事実によるものです。double値を実際の値として保存する場合は、より適切な選択になりますdecimal

System.DecimalのMSDNページによると:

10進値タイプは、多数の重要な整数および小数桁を必要とし、丸め誤差がない財務計算に適しています。Decimalタイプは、丸めの必要性を排除しません。むしろ、丸めによるエラーを最小限に抑えます。

于 2012-04-09T14:08:04.997 に答える
1

これはまったく奇妙な問題ではありません。これは、常に遭遇するフロートの魅力的な機能の1つにすぎません。floatは、そのような10進値を正確に表現できません。

したがって、結果を正確に36.36にする必要がある場合は、decimalではなくを使用してfloatください。
それ以外の場合は、自由に四捨五入できます。ただし、丸め後も正確に36.36になることはないため、丸めは役に立ちません。

于 2012-04-09T14:08:12.707 に答える