3

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

见下图:

在此处输入图像描述

这是代码:

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

4 回答 4

14

如果您检查文档

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

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

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

您还可以在维基百科上阅读更多相关信息:Round。它有时被称为银行家四舍五入,尽管据我所知银行不使用这种方法。

为确保您根据需要四舍五入:

于 2013-03-12T22:30:23.047 回答
1

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

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

检查Convert.ToInt32(double)文档

于 2013-03-12T22:30:55.547 回答
1

试试这个解决你的问题

 for (double i = 8.0; i <= 12; i = i + 0.5)
        {
            double aa = Convert.ToInt32(i);
            Console.WriteLine(aa+" "  +i );
        }
于 2013-03-12T22:38:44.893 回答
0
      double aa=  (i - Convert.ToInt32(i)) ;

看起来它是交替上下四舍五入。

并不特别令人惊讶

于 2013-03-12T22:29:18.690 回答