【问题标题】:Math.Round with negative parameter带负参数的 Math.Round
【发布时间】: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 );

谢谢。

【问题讨论】:

    标签: c# c++ rounding


    【解决方案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 的正确翻译。

      【讨论】:

      • 作为一个小提示,Borland RoundTo 和 C# Round 都默认进行银行家四舍五入,所以不用担心。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-04-24
        • 1970-01-01
        • 2015-06-28
        • 2015-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-27
        • 1970-01-01
        相关资源
        最近更新 更多