2016-03-05 29 views
2

當遇到C#中的標準數字格式字符串時,我遇到了一些非常奇怪的事情。這可能是一個已知的怪癖,但我找不到任何記錄它,我無法找到一種方法來實際得到我想要的。爲什麼C#中的數字格式字符串在未使用小數(F0)時會舍入數字?

我想採取一個數字,如17.929333333333489並格式化它沒有小數位。所以我只想要「17」。但是當運行這個代碼。

decimal what = 17.929333333333489m; 
Console.WriteLine(what.ToString("F0")); 

我得到這個輸出

18 

看着微軟的文檔,它的示例顯示了相同的輸出。

https://msdn.microsoft.com/en-us/library/kfsatb94(v=vs.110).aspx

//   F:      -195489100.84 
//   F0:     -195489101 
//   F1:     -195489100.8 
//   F2:     -195489100.84 
//   F3:     -195489100.838 

這裏是表示奇數問題的代碼示例。

http://csharppad.com/gist/d67ddf5d0535c4fe8e39

這個問題不僅侷限於標準的像「F」和「N」也是自定義的,如「#」。

我該如何使用標準的「F0」格式化程序,而不是將其編號?

回答

1

從文檔上Standard Numeric Format Strings

XX是一個可選整數稱爲精度說明。精度說明符的範圍從0到99,並影響結果中的位數。請注意,精度說明符控制數字的字符串表示形式中的數字位數。它不會圍繞數字本身。要執行舍入操作,請使用Math.CeilingMath.FloorMath.Round方法。

當精度說明符控制結果字符串中的小數位數時,結果字符串將反映從零開始捨去的數字(即使用MidpointRounding.AwayFromZero)。

因此,文檔確實討論了這一點,並且沒有明顯的方法來防止純粹通過格式字符串舍入輸出。

我能提供的最好的是截斷使用Math.Truncate()自己的號:

decimal what = 17.929333333333489m; 
decimal truncatedWhat = Math.Truncate(what); 
Console.WriteLine(truncatedWhat.ToString("F0")); 
0

我相信使用十進制與「M」末在給定的小數位四捨五入。

這是我試驗過的。

decimal what = 17.429333333333489m; 
Console.WriteLine(what.ToString("F0")); 
Console.WriteLine(what.ToString("N0")); 
Console.WriteLine(what.ToString("F1")); 
Console.WriteLine(what.ToString("N1")) 
17 
17 
17.4 
17.4 

如果你想獲得17,我用用int和deciam

double what = 17.929333333333489; 
Console.WriteLine(string.Format("{0:0}", (int)what)); 
Console.WriteLine(string.Format("{0:0}", what)); 
Console.WriteLine(string.Format("{0:0.00}", Math.Floor(what*100)/100)); 
Console.WriteLine(string.Format("{0:0.00}", what)); 
17 
18 
17.92 
17.93 
不同的方法
相關問題