for循环中的C#bug

时间:2013-03-12 22:26:41

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

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

见下图:

enter image description here

以下是代码:

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

4 个答案:

答案 0 :(得分:14)

如果您查看documentation

  

返回值
  类型:System.Int32
  值,舍入为最接近的32位有符号整数。如果值在两个整数之间,则返回偶数;也就是说,4.5转换为4,5.5转换为6.

这意味着每隔一个数字会向上舍入,然后向下,然后向上,然后向下,这意味着你将在一半的时间内获得负数。

这种方法的目的是通过始终在特定方向上舍入来平衡偏差。考虑总结大量的值,先将它们四舍五入。如果您总是向上舍入,则最终总和将始终大于对未舍入值求和然后舍入总和。但是,如果你根据上面列出的规则将上半部分和下半部分舍入,则舍入数字的最终总和更可能接近舍入的总和。

您还可以在wikipedia: Round上阅读有关此内容的更多信息。它有时被称为银行家四舍五入虽然据我所知银行不使用这种方法。

确保您按照自己的要求进行四舍五入:

答案 1 :(得分:1)

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

  

value:四舍五入到最接近的32位有符号整数。如果值在两个整数之间,则返回偶数;也就是说,4.5转换为4,5.5转换为6.

检查Convert.ToInt32(double)文档

答案 2 :(得分:1)

试试这个解决你的问题的负面痕迹

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

答案 3 :(得分:0)

      double aa=  (i - Convert.ToInt32(i)) ;

看起来像是上下四舍五入。

并不特别令人惊讶