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

Posted

技术标签:

【中文标题】如何舍入双精度值但保持尾随零【英文标题】:How to round double values but keep trailing zeros 【发布时间】:2011-10-20 08:47:40 【问题描述】:

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

例子:

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

这很简单,它只是四舍五入并转换为字符串。但是问题来了:

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

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

感谢任何帮助。请注意,在现实生活中的应用程序中,我无法硬编码小数位数。

【问题讨论】:

见:msdn.microsoft.com/en-us/library/dwhawy9k.aspx。 【参考方案1】:

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

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(也称为银行家四舍五入法)。举个例子:

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.25.ToString("F1")。谢谢。 @BaGi 如果非要说实话,我想把它改成num 变量,但我忘记了。它的工作原理很清楚:-)(就像你可以做"HelloWorld".Substring(5)一样)【参考方案2】:
string.format("0:f2", value);

【讨论】:

是的,但我不想硬编码小数位数。在我的应用程序中,小数位数取决于单位系统数据库中的内容和用户偏好。 不是d。它是fd 用于整数。来自MSDNResult: Integer digits with optional negative sign. Supported by: Integral types only.【参考方案3】:

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

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

你应该阅读的是:

Math.Round

String.Format, Custom Numeric Format

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

Extension Methods

【讨论】:

我不想硬编码小数位数。在我的应用程序中,小数位数取决于单位系统数据库中的内容和用户偏好。 这只是一个例子,从这一点你应该可以自己解决问题。最终的解决方案不会给你智慧,你往往会锁定简单的问题。 感谢您对我的教育。我错误地认为在我说我不想硬编码小数位数的部分中我没有让自己足够清楚。但是,您的示例和链接并没有让我明白我认为这里最佳解决方案的本质,这就是 xanatos 作为答案发布的内容:使用“F2”之类的东西作为格式化程序。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

简单地说:

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

【讨论】:

以上是关于如何舍入双精度值但保持尾随零的主要内容,如果未能解决你的问题,请参考以下文章

java中的舍入双[重复]

JavaScript - 保持尾随零[重复]

如何从双精度中删除尾随零 [重复]

返回没有尾随零的双精度类型

将双精度数舍入到 x 有效数字

整数,但保持精确的数字