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

Aco*_*orn 5 .net mono rounding unity-game-engine

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

Math.Round(0.5, 0, MidpointRounding.AwayFromZero)
Run Code Online (Sandbox Code Playgroud)

这是一个例子:http://ideone.com/ayMVO

pax*_*blo 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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了1预期的输出.

所以我认为你的问题不完整.现在可能是您的实际情况不使用硬编码值,0.5而是使用您认为为0.5 的变量.

我的回答是,虽然它可能接近 0.5(当然足够接近WriteLine它可能输出0.5),但它可能低于 0.5,这将导致我在上面第一段中的评论再次踢在.


根据您的链接,似乎Mono 2.8可能有错误.我倒是建议从开发商寻求支持(或只是提高bug报告)在这里.

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