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
您应该先进行舍入,然后进行格式化。
String.Format("{0:0.000}", Math.Round(someValue, 2));
Run Code Online (Sandbox Code Playgroud)
你应该阅读的是:
作为选项,您可以使用扩展来支持
归档时间: |
|
查看次数: |
11829 次 |
最近记录: |