Почему MidpointRounding.AwayFromZero и MidpointRounding.ToEven делают одно и то же?

Я столкнулся с довольно раздражающей проблемой.

Допустим, у меня есть десятичное число 2,5, и я бы хотел, чтобы оно было округлено. Все мои исследования показали мне, что:

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

Даст мне желаемый результат.

Тем не менее, при попытке именно этого куска кода он возвращает 2, а не 3, как следует. Он даже делает это в пустом консольном приложении, так как я был не уверен, может ли что-то мешать этому.

Я что-то здесь неправильно понимаю? По сути, я просто хочу, чтобы число, которое я даю, постоянно округлялось.

3 ответа

Решение

Вы упоминаете в комментарии, что вы хотите convert an int to half it's value, always rounded up,

Наиболее эффективный способ сделать это, предполагая, что int является положительным, это просто:

int result = (value+1)/2;

Если вам нужно обрабатывать положительные и отрицательные значения,

int result = (value+Math.Sign(x))/2;

Вы хотите использовать AwayFromZero. Если число оказывается между двумя целыми числами, например, 1,5, оно округляется до 2. В противном случае округление будет происходить нормально.

Вот док.

Если вы хотите всегда округлять, используйте Math.Ceiling(my_double);,

Разобрался с решением:

По сути, в моем коде я извлекал int из поля ввода, по умолчанию он был приведен как int, поэтому, когда я делил его пополам, он автоматически округлялся вниз (например, 5 / 2 = 2, а не 2,5, как я ожидая).

Решением было привести приведенное число к десятичной дроби.

Фрагмент кода с исправлением:

// strong is the input value
decimal calc = (decimal)strong / 2;

// targetInput is the input field for the result
targetInput.text = (Math.Round(calc, 0, MidpointRounding.AwayFromZero)).ToString();

Извините, если я потратил впустую время.

Другие вопросы по тегам