如何舍入双值但保持尾随零

在C#中,我想要一个将给定的double舍入到给定的小数位数的函数。 我总是希望我的函数返回一个给定小数位数的值(可以是一个字符串)。 如有必要,需要添加尾随零。

例:

string result = MyRoundingFunction(1.01234567, 3); // this must return "1.012" 

这很容易,它只是四舍五入并转换为字符串。 但问题出现了:

 string result2 = MyRoundingFuntion(1.01, 3); // this must return "1.010" 

有没有方便/标准的方法来做到这一点,还是我手动需要添加尾随零?

任何帮助表示赞赏。 请注意,在现实生活中,我不能硬编码小数。

您可以像这个示例一样创建一个格式化程序:

 int numDigitsAfterPoint = 5; double num = 1.25d; string result = num.ToString("0." + new string('0', numDigitsAfterPoint)); 

或(更容易)

 string result = num.ToString("F" + numDigitsAfterPoint); 

作为旁注, ToString使用MidpointRounding.AwayFromZero而不是MidpointRounding.ToEven (也称为Banker’s Rounding)。 举个例子:

 var x1 = 1.25.ToString("F1"); var x2 = 1.35.ToString("F1"); var x3 = Math.Round(1.25, 1).ToString(); var x4 = Math.Round(1.35, 1).ToString(); 

这些将产生不同的结果(因为Math.Round通常使用MidpointRounding.ToEven

请注意,内部ToString()似乎在舍入数字之前做了一些“魔术”。 对于双打,如果你问他少于15位,我认为它首先舍入到15位数,然后舍入到正确的位数。 请参见https://ideone.com/ZBEis9

你的解决方案(做你想要的)。

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { string result = MyRoundingFunction(1.01234567, 3); Console.WriteLine(result); result = MyRoundingFunction(1.01, 3); Console.WriteLine(result); Console.ReadLine(); } public static string MyRoundingFunction(double value, int decimalPlaces) { string formatter = "{0:f" + decimalPlaces + "}"; return string.Format(formatter, value); } } } 
 string.format("{0:f2}", value); 

你应该首先轮,然后格式化。

 String.Format("{0:0.000}", Math.Round(someValue, 2)); 

你应该读的是:

Math.Round

String.Format , 自定义数字格式

作为选项,您可以使用扩展来支持它

扩展方法

只是:

 decimal.Round(mydouble, 2).ToString("0.00")