在C#中,我想要一个将给定的double舍入到给定的小数位数的函数。我总是希望我的函数返回一个给定小数位数的值(可以是一个字符串)。如有必要,需要添加尾随零。
示例:
string result = MyRoundingFunction(1.01234567, 3);
// this must return "1.012"
这很容易,只是四舍五入并转换为字符串。但问题出现了:
string result2 = MyRoundingFuntion(1.01, 3);
// this must return "1.010"
是否有方便/标准的方法来执行此操作,还是我手动需要添加尾随零?
感谢任何帮助。请注意,在现实生活中,我不能硬编码小数位数。
答案 0 :(得分:12)
您可以像这个示例一样创建格式化程序:
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
答案 1 :(得分:4)
string.format("{0:f2}", value);
答案 2 :(得分:3)
您的解决方案(做您想做的事)。
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);
}
}
}
答案 3 :(得分:2)
你首先要圆,然后格式化。
String.Format("{0:0.000}", Math.Round(someValue, 2));
您应该阅读的内容是:
String.Format,Custom Numeric Format
作为选项,您可以使用扩展程序来支持
答案 4 :(得分:0)
简单地:
decimal.Round(mydouble, 2).ToString("0.00")