【问题标题】:C# bug in a for loopfor 循环中的 C# 错误
【发布时间】:2013-03-12 22:26:41
【问题描述】:

我不应该得到负数,请看下面的截图:

见下图:

代码如下:

    for (double i=8.0; i<=12;i=i+0.5)
        {
          double aa=  (i - Convert.ToInt32(i)) ;
          Console.WriteLine(" "+i+" "+aa);
        }

【问题讨论】:

标签: c# visual-studio-2010 for-loop console


【解决方案1】:

如果你检查documentation

返回值
类型:System.Int32
值,四舍五入到最接近的 32 位有符号整数。如果 value 在两个整数的中间,则返回偶数;即4.5转4,5.5转6。

这意味着每隔一个数字将向上取整,然后向下取整,然后向上取整,然后向下取整,这意味着您将得到一半的负数。

此方法的目的是消除由于始终沿特定方向舍入而引入的偏差。考虑总结大量的值,首先将它们四舍五入。如果你总是四舍五入,最终的总和总是大于对未四舍五入的值求和然后四舍五入的总和。但是,如果您按照上述规则向上取整和向下取整,则四舍五入的最终总和更有可能更接近四舍五入的总和。

您还可以在wikipedia: Round 上阅读更多相关信息。它有时被称为bankers rounding,尽管据我所知银行不使用这种方法。

为了确保您按照自己的意愿进行舍入:

【讨论】:

  • 不要忘记您也可以接受答案,如果您觉得它回答了您的问题,只需单击投票下方的绿色打开复选标记即可获得答案。欢迎来到 Stack Overflow,希望你留下来!
【解决方案2】:

我不知道你会期望什么,但在这种情况下 double 是四舍五入的,而不是截断的

值:四舍五入到最接近的 32 位有符号整数。如果 value 在两个整数的中间,则返回偶数;即4.5转4,5.5转6。

查看Convert.ToInt32(double) 文档

【讨论】:

    【解决方案3】:

    试试这个解决你的问题负分

     for (double i = 8.0; i <= 12; i = i + 0.5)
            {
                double aa = Convert.ToInt32(i);
                Console.WriteLine(aa+" "  +i );
            }
    

    【讨论】:

      【解决方案4】:
            double aa=  (i - Convert.ToInt32(i)) ;
      

      看起来是上下交替舍入。

      并不特别令人惊讶

      【讨论】:

      • 似乎对偶数的舍入而不是截断的偏差较小。
      • 他的代码示例是独立的。为什么不复制粘贴到 LINQPad 之类的东西中,而不是胡乱猜测?
      • @millimoose 感谢 LINQPad!我的一生都在哪里?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 2019-01-02
      • 2017-09-13
      • 1970-01-01
      相关资源
      最近更新 更多