2011-12-14 101 views
1

我發現了一個非常有趣的事情,將字符串解析爲一個浮點值。的情況下是該字符串值是從通過使用IDbReader這裏數據庫獲得的一個例子:.net解析()四捨五入浮點值

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的sValue的內容不能被解析爲原始值(正如我可以看到從VS調試)。它將浮點值舍入爲小數點後2位數的浮點值。我怎樣才能獲得原始價值?

我如何得到完全相同的值?

我使用NET 2.0

更新:我試圖用的getXXX如GetFloat或GetDecimal方法直接得到的值到一個浮點/十進制值。不幸的是,所有這些方法似乎都有類似的舍入問題。只有GetValue()和強制爲字符串纔會獲得與數據庫中完全相同的字符串值。我認爲我可以在.Net端進行浮點或小數值轉換,但在我的情況下,Parse()失敗。我不確定爲什麼舍入發生在Parse()中。正如一些人建議的價值在那裏,它可能是VS調試,監視或日誌造成四捨五入。但是,當我嘗試將浮點值放到文本框中時,它會在小數點後四捨五入爲2位數。這真是一個令人沮喪的問題。

+4

爲什麼它是一個字符串? – SLaks 2011-12-14 18:07:33

+1

並非所有``「12.339123」`是相等的。 – 2011-12-14 18:09:27

+0

該列的數據類型是什麼? – 2011-12-14 18:11:40

回答

0

試試這個方法:

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

我不知道你是如何看這個變量,看12.34。如果我在LINQPad中執行以下操作:

Single.Parse("12.339123") 

我得到12.33912。如果我問它給我的全力往返精度的字符串:

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

我得到12.3391228,因爲你要得到一個純粹的單精度浮點這是接近正好12.339123點值。

結論:您正在使用不精確的方法來檢查變量的值。這個變量本身幾乎可以肯定是正確的,並且具有與浮點一樣精確的值;只是調試器的工具提示,監視窗口或日誌庫,或者你用來查看該值的任何內容,只是向你顯示一些數字。