2011-12-14 5 views
1

文字列を浮動小数点数に解析することについて、非常に興味深いことがあります。私は一定の文字列を解析しテストする場合.net Parse()float float values

IDbReader myReader; 
... 
string sValue = myReader.GetValue(0).ToString(); // 12.339123 for example in VS debug and watch 
// the content of sValue is what I want to be at this point, but... 
Single fValue = Single.Parse(sValue); 
// Now the fValue is 12.34! 

は、Parseメソッドが正常に動作:

string sValue = "12.339123"; 
Single fValue = Single.Parse(sValue); 
// Now the fValue is 12.339123! 

場合は、文字列値をここIDbReader使用してデータベースから取得した例でありますIDbReaderのsValueの内容を元の値として解析できない理由はわかりません(VSデバッグからわかるように)。 float値を小数点以下2桁のfloat値に丸めます。どのようにして元の価値を得ることができますか?

どうすれば正確に同じ値を返すことができますか?

私は

更新.NET 2.0を使用しています:私はfloat型/小数値に直接値を取得するには、このようなGetFloatをやGetDecimalメソッドとしてのgetXXXを使用しようとしました。残念ながら、これらのメソッドはすべて同様の丸め問題を抱えているようです。 GetValue()とstringへの強制は、データベースとまったく同じ文字列値を取得します。私は浮動小数点または小数点値の.Net側の変換を行うことができると思ったが、Parse()は私のケースでは失敗する。 Parse()で丸めが発生する理由はわかりません。いくつかの値がそこにあると示唆したように、VSデバッグ、ウォッチまたはログによる丸めの原因になることがあります。しかし、フロート値をテキストボックスに入れると、小数点以下2桁に丸められます。それは本当にイライラする問題です。

+4

なぜ文字列ですか? – SLaks

+1

12.339123 "がすべて等しいわけではありません。 –

+0

列のデータ型は? –

答えて

0

は、この方法を試してみてください。

string sValue = myReader.GetValue(0).ToString("F6"); 
+0

しかし、それはすべての場合に有用ではありません。 –

+0

申し訳ありませんが、ここでは.ToString()を呼び出します:float fValue = float.Parse(sValue.ToString( "F6")); – antigravity

+0

真。 PL/SQLの値はすべて異なる浮動小数点値または整数値です。私はPL/SQLツールで何を見ても価値を得ることを好む。 –

1

は、私はあなたがその変数を見て、12.34を見ているかどうかはわかりません。私がLINQPadで次のことをすれば:

Single.Parse("12.339123") 

私は12.33912を得ます。そして、私は私の完全な往復精度で文字列を与えるためにそれを頼む場合:

Single.Parse("12.339123").ToString("r") 

私はあなたが単なる単精度浮動で取得するつもりだと正確12.339123に近いです12.3391228を取得ポイント値。

結論:変数の値を検査するために不正確な手段を使用しています。変数自体はほぼ確実にうまくいき、浮動小数点として許容される値と同じくらい正確に保持されます。デバッガのツールチップ、ウォッチウィンドウ、ロギングライブラリ、またはその値を見るために使用しているものは、ほんの一桁にすぎません。

+0

私は浮動小数点値で代入された定数または変数を持つケースを試しました。彼らは正常に動作します。しかし、IDbReaderから値を取得すると、float値は小数点以下2桁に丸められます。それは私がまだ理解できないパズルです。今では、元の値を保持するためにstringを使用して値を保存し、提示する必要があります。 –