8

全部,

我正在尝试将 Borland C++ 代码转换为 C#。在旧代码中,我看到以下内容:

double a = RoundTo( b, -2 );

查看 Borland 文档,我发现 RoundTo() 接受正参数和负参数以提高精度。正数表示舍入到 10^n,负数表示舍入到 10^-n。

查看 Math.RoundTo() 的 C# 文档,我找不到它是否会接受负数以确保精度的参考。并且所有样本都以正数表示。

在这种情况下转换代码的正确方法是什么?我是否应该忘记标志并写下:

double a = Math.Round( b, 2 );

谢谢你。

4

3 回答 3

5

我不知道针对您要进行的舍入类型的内置解决方案,但这并不意味着某处没有。一个快速的解决方案是创建一个方法甚至扩展方法来做你正在寻找的东西:

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);
    }
}
于 2012-08-20T20:19:04.173 回答
4

C# 中双精度数的Math.Round不能接受数字的负值(事实上,如果数字小于 0 或大于 15,则在该页面中记录了抛出 ArgumentOutOfRangeException )

该参数是在 Math.Round 的情况下,而不是要求一定数量的小数位,这意味着参数的符号将被反转,所以在你的情况下,是的,

double a = Math.Round( b, 2 );

将是带有 -2 参数的 RoundTo 的正确翻译。

于 2012-08-20T19:49:56.180 回答
2

你试过了吗?我做了并得到了一个例外:

System.ArgumentOutOfRangeException:四舍五入的数字必须介于 0 和 15 之间,包括 0 和 15。
参数名称:数字
   在 System.Math.Round(双值,Int32 位)
   在 MyClass.RunSnippet()
   在 MyClass.Main()
于 2012-08-20T19:50:17.923 回答