为什么0.5舍入MidpointRounding.AwayFromZero导致0?

时间:2012-02-28 02:16:20

标签: .net mono rounding unity3d

为什么这会导致0而不是1?

Math.Round(0.5, 0, MidpointRounding.AwayFromZero)

以下是一个示例:http://ideone.com/ayMVO

2 个答案:

答案 0 :(得分:8)

通常,有这样的问题,这是因为这个数字不能在IEEE754中完全表示 - 它最有可能被转换为0.4999999999 ...或类似于将其舍入为零的那些。

然而,0.5(1/2) 在IEEE754中完全可以表示,所以情况并非如此。

编译器可能在将文本转换为数字时出错,但我认为这不太可能。实际上,当我在VC#2010中编译并运行以下内容时:

using System;
namespace ConsoleApplication1 {
    class Program {
        static void Main (string[] args) {
            Console.WriteLine (Math.Round (0.5, 0, MidpointRounding.AwayFromZero));
        }
    }
}

我按预期获得1的输出。

所以我认为你的问题并不完整。现在可能是您的实际情况不使用0.5的硬编码值,而是使用您相信的变量为0.5。< / p>

我对此的回答是,虽然它可能关闭到0.5(当然足够接近它的简单WriteLine可能输出0.5),它可能是一个触摸 0.5以下,这将导致我在上面第一段中的评论再次启动。


根据您的链接,似乎Mono 2.8可能有错误。我建议寻求开发人员的支持(或者只是提出错误报告)here

实际上,用gmcs 2.6.7在本地试过它,这绝对是一个bug。那个确切的代码编译好了,但生成了0而不是1.已经提出了bug report,并且我已经添加了我自己的信息。

答案 1 :(得分:0)

当我调试它时,这也为我返回1.0。

Math.Round(0.5, 0, MidpointRounding.AwayFromZero)