簡體   English   中英

C#Convert.ToDouble()在將字符串轉換為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答案的第一部分):

十進制vs雙! - 我應該使用哪一個?何時使用?

雙精度並不總是保持精度,具體取決於您嘗試轉換的數字

如果您需要精確,則需要使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM