2017-04-04 188 views
-1

將字符串解析爲雙倍時,我們正面臨一個問題。我們需要將18位數字字符串(< 123,456,789,012>。< 123456>)轉換爲雙倍。它僅在小數點後返回5位數字。當我們試圖減少數字的數量時,它運行良好。我們附上了三種不同場景的屏幕截圖。變量'S'是輸入,retValue是輸出值。類型鑄造問題

請幫助我們將123,456,789,012.123456到123456789012.123456

string s = "123,456,789,012.123456"; 
double retVal; 
System.Globalization.CultureInfo cInfo = new System.Globalization.CultureInfo(System.Web.HttpContext.Curr‌​ent.Session["culture‌​"].ToString()); 
retVal = double.Parse(s, NumberStyles.Any, cInfo); 

Issue screen shot

+3

告訴我們你試過了什麼? ;) 好的,它在你的屏幕截圖中。爲什麼不把它作爲代碼添加到你的問題中?對我們所有人來說會更容易。 –

+0

解析值可能無法在double類型中精確表示。 – Codor

+0

我們已將它添加到Issue屏幕截圖中 –

回答

3

您遇到了像double這樣的所有浮點數據類型固有的精度問題。如果您需要更精確的精度,你應該使用decimal代替:

string s = "987,654,321.123456"; 
decimal d = decimal.Parse(s); 

看到它在行動:https://repl.it/Gtoy/0

編輯:作爲帕納約蒂斯Kanavos指出,decimal也不是完美的。它使用128位而不是double的64位。但是,double使用其位表示更大的數字,decimal使用它來表示更小的數字,精度更高。

+0

十進制不精確,是一個128位浮點數,其範圍縮小且精度高於其他類型 –