C#中for循环中的bug问题

3

我不应该得到负数,如下面的截图所示:

请看下面的图片:

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);
        }

这是一种相当常见的默认舍入模式,因为它消除了偏差:http://en.wikipedia.org/wiki/Rounding#Round_half_to_even - millimoose
这很可能是重复的问题: https://dev59.com/GHVC5IYBdhLWcg3wYQEp - Derek Tomes
4个回答

14

如果您查看文档

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

这意味着每隔一个数会向上取整,然后向下取整,再向上取整,最后向下取整,这意味着一半的时间会得到负数。

此方法的目的是平衡始终向特定方向舍入所引入的偏差。考虑将大量值相加并先对它们进行舍入。如果总是向上舍入,则最终和总是大于将未舍入值相加然后对和进行舍入的总和。但是,如果根据上述规则一半向上舍入,一半向下舍入,则舍入数字的最终总和更可能接近舍入总和。

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

为确保按您想要的方式进行舍入:


不要忘记,如果你觉得某个回答解决了你的问题,你也可以接受它。只需点击答案下面绿色的打勾标志即可。欢迎来到 Stack Overflow,希望你能留下来! - Lasse V. Karlsen

1
我不知道您期望什么,但在这种情况下,双精度数会被舍入,而不是截断。

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

请查阅 Convert.ToInt32(double) 文档


1

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

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

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

看起来它在交替地四舍五入。

并不特别令人惊讶。


似乎更偏向于将数字四舍五入至偶数而非直接截断。 - millimoose
1
他的代码示例是自包含的。为什么不将其复制粘贴到类似于LINQPad的工具中,而要猜测呢? - millimoose
@millimoose 谢谢LINQPad!那个东西我的整个生命都在哪里? - poke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接