2014-03-05 130 views
17

有沒有辦法獲得一個字符串顯示確切double,與所有所需的小數位,以表示其基準10的精確值?有沒有一種方法可以完全格式化C#double?

例如(通過Jon Skeet and Tony the Pony),當你鍵入

double d = 0.3; 

d的實際值是完全

0.299999999999999988897769753748434595763683319091796875 

每個二進制浮點值(忽略的東西類似於無窮大和NaN的)會解析爲終止十進制值。因此,如果輸出中有足夠的精度位數(在這種情況下爲55),則可以始終採用double中的任何值並以十進制顯示其精確值。當需要解釋浮點運算的奇怪時,能夠向人們展示確切的值將非常有用。但有沒有辦法在C#中做到這一點?

我試過所有的standard numeric format strings,都有指定精度和沒有精度,沒有提供確切的值。有幾個亮點:

  • d.ToString("n55")輸出0.3其次是54零 - 它其一貫的「輪你可能想看看」,然後大頭針上到底有多零。如果我使用的0.00000...
  • d.ToString("r")一個自定義格式字符串一樣的東西給你足夠精密,如果你分析它,你會得到你開始用相同的位模式的值 - 但在這種情況下,它只是輸出0.3 。 (如果我處理的是一個計算的結果,而不是常數這將是更爲有用。)
  • d.ToString("e55")輸出2.9999999999999999000000000000000000000000000000000000000e-001 - 一些的精度,但不這一切像我期待的。

有一些格式字符串我錯過了,或者一些其他的庫函數,或者NuGet包或其他圖書館,即能夠將double轉換爲具有全精度的字符串?

+2

你可以用約翰飛碟雙向的DoubleConverter類:http://www.yoda.arachsys.com/csharp/DoubleConverter.cs 見本回答:http://stackoverflow.com/a/1658420/1445661 – mao47

+0

我不得不問的問題是:你需要什麼?如果你解釋你想要什麼,或許我們可以給你一個更好的方法來獲得它。 –

+2

需要經過第16位有效數字的數據才能精確地表示double的二進制值。該二進制值遵循語言和IEEE浮點標準規則的某種組合。看到這些數字對於理解浮點行爲和舍入很重要。在Java中,我會轉換爲BigDecimal,它的默認toString會產生它的確切值。 –

回答

-3

我相信你能做到這一點,根據自己想要的與顯示器來完成:

考慮一下:

Double myDouble = 10/3; 

myDouble.ToString("G17"); 

你的輸出將是:

3.3333333333333335 

見本鏈接爲什麼:http://msdn.microsoft.com/en-us/library/kfsatb94(v=vs.110).aspx

默認情況下,返回值僅包含15位精度,儘管內部最多保留17位數字。如果此實例的值大於15位,ToString會返回PositiveInfinitySymbol或NegativeInfinitySymbol,而不是預期的數字。如果您需要更高的精度,請使用「G17」格式規範指定格式,該規格始終返回17位精度或「R」,如果數字可以用該精度表示,則返回15位;如果數字只能爲以最大精度表示。

你也可以這樣做:

myDouble.ToString("n16"); 

這將丟棄第16和17位的噪音,並返回以下:

3.3333333333333300 

如果你希望顯示的實際變量價值作爲一個數字,你可能會想要使用「G17」。如果您試圖以高精度顯示正在計算中使用的數值,則需要使用「n16」。

+0

這不是什麼OP想要的,我一開始也是同樣的心理想法,並且發表了類似於你的回答的評論,但之後刪除了它。 –

-1

如果要抑制尾隨零,並且避免使用科學記數法,則可以嘗試使用#佔位符。雖然你所需要的非常小的數字了他們很多,如:

Console.WriteLine(double.Epsilon.ToString("0.########....###")); 
+0

這不起作用,.NET框架在格式化程序應用之前預先調用。 –

相關問題