有沒有辦法獲得一個字符串顯示確切值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
轉換爲具有全精度的字符串?
你可以用約翰飛碟雙向的DoubleConverter類:http://www.yoda.arachsys.com/csharp/DoubleConverter.cs 見本回答:http://stackoverflow.com/a/1658420/1445661 – mao47
我不得不問的問題是:你需要什麼?如果你解釋你想要什麼,或許我們可以給你一個更好的方法來獲得它。 –
需要經過第16位有效數字的數據才能精確地表示double的二進制值。該二進制值遵循語言和IEEE浮點標準規則的某種組合。看到這些數字對於理解浮點行爲和舍入很重要。在Java中,我會轉換爲BigDecimal,它的默認toString會產生它的確切值。 –