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

Bar*_*ens 8 c# math double rounding c#-2.0

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

例:

string result = MyRoundingFunction(1.01234567, 3);
// this must return "1.012"
Run Code Online (Sandbox Code Playgroud)

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

string result2 = MyRoundingFuntion(1.01, 3);
// this must return "1.010"
Run Code Online (Sandbox Code Playgroud)

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

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

xan*_*tos 12

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

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

或(更容易)

string result = num.ToString("F" + numDigitsAfterPoint);
Run Code Online (Sandbox Code Playgroud)

作为旁注,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();
Run Code Online (Sandbox Code Playgroud)

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

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


Dam*_*ash 6

您应该先进行舍入,然后进行格式化。

String.Format("{0:0.000}", Math.Round(someValue, 2));
Run Code Online (Sandbox Code Playgroud)

你应该阅读的是:

数学轮

String.Format自定义数字格式

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

扩展方法