Почему 0,5 округляется с MidpointRounding.AwayFromZero в результате 0? - PullRequest
5 голосов
/ 28 февраля 2012

Почему это приводит к 0, а не 1?

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

Вот пример: http://ideone.com/ayMVO

Ответы [ 3 ]

8 голосов
/ 28 февраля 2012

Обычно, с такими проблемами, это потому, что число не может быть точно представлено в 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.

Мой ответ на этот вопрос таков: хотя это может быть близко к 0,5 (конечно, достаточно близко, чтобы простое WriteLine его могло бы выдать 0,5), это, вероятно, прикосновение ниже 0,5, что приведет к тому, что мои комментарии в первом абзаце выше снова сработают.


Судя по вашей ссылке, в Mono 2.8 может быть ошибка. Я бы предложил обратиться за поддержкой к разработчикам (или просто поднять отчет об ошибке) здесь .

На самом деле, попробовав его локально с помощью gmcs 2.6.7, это определенно ошибка. Этот точный код скомпилирован, но генерирует 0, а не 1. Отчет об ошибке был поднят, и я добавил к нему свою собственную информацию.

0 голосов
/ 16 августа 2016

0,5 - это двойное число.

Если вы делаете

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

Будет работать как положено

0 голосов
/ 28 февраля 2012

Это также возвращает 1.0 для меня, когда я отлаживал его.

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