如何舍入双值但保持尾随零
在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")