2012-04-09 38 views
-1

float.Parseのメソッドを使用することが分かりましたが、問題にぶつかりました。文字列を浮動小数点数に変換する

私は文字列 "36.360"を解析していますが、解析されたfloatは36.3600006103516になります。

小数点以下3桁まで四捨五入しても安全ですか、文字列から浮動小数点数を解析するためのより良い方法があります。

明らかに私は36.360に解析された浮動小数点数を探しています。

+3

申し訳ありませんが、私はタグとタイトルに入れます。次回はタイトルに入れません – Abstract

答えて

1

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

進値型が重要一体と小数桁 なし丸め誤差を大量に必要とする財務計算 ために適切です。 Decimalタイプでは、丸めには の必要性が排除されません。むしろ、それは丸めによる誤差を最小にする。

+0

これが答えたと結論づける理由は、msdnページを引用し、財務計算を指摘したことによるものです。状況に完璧に答えました。ありがとう! – Abstract

+0

"メモリから値を読み取るための数学的処理"という意味はわかりません。実際、 'float'と' double'の本当の「問題」は、値を基数2の分数として保存し、有限の基数10の表現で無限の基数2の表現を持つ数があるということです。 – phoog

+0

@phoog - 私が言ったことは、プロセッサがメモリから 'float'または' double'を読み込むときに、Sign、Exponent、Mantissaを取り出して[Wikipedia](http ://en.wikipedia.org/wiki/Double-precision_floating-point_format)。関与する数学のために、あなたは正確な値ではなく、値の近似値になります。 'float'や' double'が与えることができる唯一の正確な値は、1と2の累乗であり、それでも正しく計算するのはプロセッサに依存します。一方、メモリ内の整数は常に正確な値を持ちます。 –

3

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

Wikipedia(ウェブ上の多くの記事)で問題を説明しています。

2

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

+2

"決して平等ではない"というのはよくある誤解です。 'float'が正確に保存できる数十億の値があります。例えば、多くの整数。浮動小数点数に1234567.0を格納し、比較すると正確な結果を得ることができます。浮動小数点数を格納するのはあまりよくありません。 –

+0

@ MrLister +1であり、さらに、多くの小数値は、バイナリ浮動小数点システムで正確に表すことができます(たとえば、0.5)。実際には、すべてのfloat型またはdouble型のパターンは、inifinity、NaN、またはいくつかの正確な数値を表します。 – phoog

+0

@MrLister Trueですが、浮動小数点数が正確に格納できない何十億もの値があります。したがって、浮動小数点数で正確に表現できる値が変数に含まれていることを保証できない限り、それは価値があるよりも。コード例: 'debug.print((float)3.141 == 3.141?true:false)'は真でなければならないことは明白ですが、 'false'を生成します。 – saluce

1

浮動小数点数の精度には制限があります。詳細はthis linkをご覧ください。

さらに正確なトラッキングが必要な場合は、doubleまたはdecimalタイプのようなものを使用することを検討してください。

1

これはまったく奇妙な問題ではありません。それは常に浮かび上がるフロートの魅力的な機能の1つです。浮動小数点数は、そのような小数値を正確に表現することはできません!

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

関連する問題