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

时间:2011-10-20 08:47:41

标签: c# math c#-2.0 double rounding

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

示例:

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

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

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

是否有方便/标准的方法来执行此操作,还是我手动需要添加尾随零?

感谢任何帮助。请注意,在现实生活中,我不能硬编码小数位数。

5 个答案:

答案 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));

您应该阅读的内容是:

Math.Round

String.FormatCustom Numeric Format

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

Extension Methods

答案 4 :(得分:0)

简单地:

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