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