簡體   English   中英

為什么C#中的數字格式字符串在不使用小數(F0)時會對數字進行舍入?

[英]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.CeilingMath.FloorMath.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.

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