Почему 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();
Извините, если я потратил впустую время.