[英]Why do the numeric format strings in C# round the number when not using decimals (F0)?
在C#中使用標准數字格式字符串時遇到了一些非常奇怪的事情。 這可能是一個已知的怪癖,但我找不到記錄它的任何東西,我無法找到實際得到我想要的方法。
我想取一個像17.929333333333489這樣的數字,並將其格式化為無小數位。 所以我只想要“17”。 但是在運行此代碼時。
decimal what = 17.929333333333489m;
Console.WriteLine(what.ToString("F0"));
我得到了這個輸出
18
查看Microsoft的文檔,他們的示例顯示了相同的輸出。
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”格式化器而不是我的數字?
從標准數字格式字符串的文檔:
xx是一個可選的整數,稱為精度說明符 。 精度說明符的范圍是0到99,它會影響結果中的位數。 請注意,精度說明符控制數字的字符串表示形式中的位數。 它不會對數字本身進行舍入。 要執行舍入操作,請使用
Math.Ceiling
,Math.Floor
或Math.Round
方法。當精度說明符控制結果字符串中的小數位數時,結果字符串會反映從零開始舍入的數字(即使用MidpointRounding.AwayFromZero)。
因此文檔確實討論了這一點,並且沒有明顯的方法來防止純粹通過格式字符串舍入輸出。
我能提供的最好的是使用Math.Truncate()
截斷數字:
decimal what = 17.929333333333489m;
decimal truncatedWhat = Math.Truncate(what);
Console.WriteLine(truncatedWhat.ToString("F0"));
我相信最后使用帶有“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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.