带负参数的 Math.Round
Posted
技术标签:
【中文标题】带负参数的 Math.Round【英文标题】:Math.Round with negative parameter 【发布时间】:2012-08-20 19:43:52 【问题描述】:所有,
我正在尝试将 Borland C++ 代码转换为 C#。 在旧代码中,我看到以下内容:
double a = RoundTo( b, -2 );
查看 Borland 文档,我看到 RoundTo() 接受正参数和负参数以提高精度。正数表示舍入到 10^n,负数表示舍入到 10^-n。
查看 Math.RoundTo() 的 C# 文档,我找不到它是否会接受负数以确保精度的参考。并且所有样本都以正数表示。
在这种情况下转换代码的正确方法是什么?我是否应该忘记标志并写:
double a = Math.Round( b, 2 );
谢谢。
【问题讨论】:
【参考方案1】:我不知道针对您要进行的舍入类型的内置解决方案,但这并不意味着某处没有解决方案。一个快速的解决方案是创建一个方法甚至扩展方法来做你正在寻找的事情:
double DoubleRound(double value, int digits)
if (digits >= 0)
return Math.Round(value, digits);
else
digits = Math.Abs(digits);
double temp = value / Math.Pow(10, digits);
temp = Math.Round(temp, 0);
return temp * Math.Pow(10, digits);
【讨论】:
【参考方案2】: C# 中的Math.Round for doubles 不能接受 digits 的负值(事实上,如果数字小于 0 或大于 15,则在该页面中记录了抛出 ArgumentOutOfRangeException)
参数是在 Math.Round 的情况下,而不是要求一定数量的小数位数,这意味着参数的符号将被反转,所以在你的情况下,是的,
double a = Math.Round( b, 2 );
将是带有 -2 参数的 RoundTo 的正确翻译。
【讨论】:
作为一个小提示,BorlandRoundTo
和 C# Round
都默认进行银行家四舍五入,所以不用担心。【参考方案3】:
你试过了吗?我做了并得到了一个例外:
System.ArgumentOutOfRangeException:四舍五入的数字必须介于 0 和 15 之间,包括 0 和 15。 参数名称:数字 在 System.Math.Round(双值,Int32 位) 在 MyClass.RunSnippet() 在 MyClass.Main()
【讨论】:
以上是关于带负参数的 Math.Round的主要内容,如果未能解决你的问题,请参考以下文章
Math.round() 函数返回一个数字四舍五入后最接近的整数。
JS indexOf(),split(),substring(),substr(),Math.ceil(),Math.floor(),Math.round()的内容