[英]C# - Using NumberFormatInfo with Convert.ToDouble to return double
[英]C# Convert.ToDouble() loses decimal points when converting string to double
假設我們有以下簡單代碼
string number = "93389.429999999993";
double numberAsDouble = Convert.ToDouble(number);
Console.WriteLine(numberAsDouble);
該轉換后numberAsDouble
變量的值為93389.43。 我該怎么做才能使這個變量保持完整的數字而不是四舍五入呢? 我發現Convert.ToDecimal
行為方式不同,但我需要將值設為double。
-------------------小更新---------------------
在上面代碼的第2行中放置一個斷點,表明numberAsDouble變量在控制台中顯示之前具有舍入值93389.43。
93389.429999999993
不能被精確為64位浮點數來表示。 double
只能容納15或16位數,而你有17位數。 如果您需要該級別的精度,請使用decimal
。
(我知道你說你需要它作為雙倍,但如果你能解釋原因,可能有其他解決方案)
這是預期的行為。
雙精度不能完全代表每個數字。 這與字符串轉換無關。
你可以自己檢查一下:
Console.WriteLine(93389.429999999993);
這將打印93389.43
。
以下還說明了這一點:
Console.WriteLine(93389.429999999993 == 93389.43);
這打印為True
。
請注意,此處有兩次轉化。 首先,您將字符串轉換為double,然后將該double轉換回字符串以顯示它。
你還需要考慮double
沒有無限精度; 根據字符串的不同,某些數據可能會丟失,因為double不具備存儲它的能力。
當轉換為雙倍時,它不會比它更“圓”。 考慮到double的功能,它將創建最接近所提供數字的雙精度。 將該double轉換為字符串時,更有可能不保留某些信息。
請參閱以下內容(特別是Michael Borgwardt答案的第一部分):
雙精度並不總是保持精度,具體取決於您嘗試轉換的數字
如果您需要精確,則需要使用decimal
這是double
精度可以存儲的精度限制。 您可以嘗試轉換3389.429999999993
來自己查看。
double
類型具有64位的有限精度,因此當實數存儲在numberAsDouble變量中時會發生舍入錯誤。
適用於您的示例的解決方案是使用decimal
類型,它具有128位精度。 然而,同樣的問題出現了較小的差異。
對於任意大數字,.NET Framework 4.0中的System.Numerics.BigInteger
對象支持整數的任意精度。 但是,您需要第三方庫來使用任意大的實數。
您可以將小數位截斷為所需的位數,而不是超過雙精度。
例如,這將截斷到5位小數,得到93389.42999。 只需將100000替換為所需的值即可
string number = "93389.429999999993";
decimal numberAsDecimal = Convert.ToDecimal(number);
var numberAsDouble = ((double)((long)(numberAsDecimal * 100000.0m))) / 100000.0;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.