Как округлить до ближайшего целого числа в C #


92

Как округлить значения до ближайшего целого числа?

Например:

1.1 => 1
1.5 => 2
1.9 => 2

"Math.Ceiling ()" мне не помогает. Любые идеи?


1
Math.Round () может помочь.
Only Bolivian Here

Ответы:


202

См. Дополнительную информацию в официальной документации . Например:

В основном вы даете Math.Roundметоду три параметра.

  1. Значение, которое нужно округлить.
  2. Количество десятичных знаков, которое вы хотите оставить после значения.
  3. Необязательный параметр, который можно вызвать для использования округления AwayFromZero. ( игнорируется, если округление не является неоднозначным, например 1,5 )

Образец кода:

var roundedA = Math.Round(1.1, 0); // Output: 1
var roundedB = Math.Round(1.5, 0, MidpointRounding.AwayFromZero); // Output: 2
var roundedC = Math.Round(1.9, 0); // Output: 2
var roundedD = Math.Round(2.5, 0); // Output: 2
var roundedE = Math.Round(2.5, 0, MidpointRounding.AwayFromZero); // Output: 3
var roundedF = Math.Round(3.49, 0, MidpointRounding.AwayFromZero); // Output: 3

Живая демонстрация

Вам нужно, MidpointRounding.AwayFromZeroесли вы хотите округлить значение 0,5. К сожалению, это не поведение по умолчанию для Math.Round(). При использовании MidpointRounding.ToEven(по умолчанию) значение округляется до ближайшего четного числа ( 1.5округляется до 2, но 2.5также округляется до 2).


14
с другой стороны, использование away from zeroтакже означает -1.5округление до -2.
davogotland

2
используйте Math.Ceiling, не рекомендуется использовать Math.Round для трений, прочтите: stackoverflow.com/questions/9221205/… ,
Усадьба Якира

3
Я обнаружил, что Math.Round (1.5, 0) возвращает 2
Дэвид Сайкс

@davogotland - это их все равно от 137,5 до 140, а не до 138? Я имею в виду округление до ближайшей десятой?
Сэм

1
@sam, возможно, разделить на 10, затем округлить с помощью Math.Ceiling и, наконец, умножить на 10?
Давоготланд 01

64
Math.Ceiling

всегда округляется вверх (к потолку)

Math.Floor

всегда округляется вниз (к полу)

то, что вам нужно, это просто

Math.Round

какие раунды согласно этому сообщению


их так или иначе округлить до 137,5 до 140, а не до 138? Я имею в виду округление до ближайшей десятой?
sam

7

Вам нужно Math.Round, не Math.Ceiling. Ceilingвсегда «округляет» в Roundбольшую сторону , в то время как округляет в большую или меньшую сторону в зависимости от значения после десятичной точки.


6

есть это руководство, и тоже довольно мило:

double d1 = 1.1;
double d2 = 1.5;
double d3 = 1.9;

int i1 = (int)(d1 + 0.5);
int i2 = (int)(d2 + 0.5);
int i3 = (int)(d3 + 0.5);

просто добавьте 0,5 к любому числу и преобразуйте его в int (или превратите его в пол), и оно будет математически правильно округлено: D


Это все еще выглядит подозрительно. Во - первых, вопрос касается округлением до и во- вторых, когда я попробовал это только сейчас, реализацию по умолчанию Math.Round (1.5) раундов до 2. Таким образом , это не может быть то , что он хотел.
ver

Кроме того, в вашем примере десятичная точка смешивается с десятичной запятой. Какой из них вы обычно используете (я думаю, в Швеции)? :)
ver

упс ... о да, извините. в программировании десятичная точка, конечно, но в формальном тексте мы используем десятичную запятую. и да, Швеция ^^ по поводу вопроса и части "округления": я думаю, что это просто языковая ошибка. в примерах, данных op, некоторые десятичные числа округляются в меньшую сторону.
davogotland

@ver я не округляю с помощью Math.Round, я делаю это с помощью гипса. вот почему этот способ ручной и довольно симпатичный;)
davogotland

5

Вы можете использовать Math.Round, как предлагали другие (рекомендуется), или вы можете добавить 0,5 и привести к int (что приведет к удалению десятичной части).

double value = 1.1;
int roundedValue = (int)(value + 0.5); // equals 1

double value2 = 1.5;
int roundedValue2 = (int)(value2 + 0.5); // equals 2

5

Просто напоминание. Остерегайтесь двойного.

Math.Round(0.3 / 0.2 ) result in 1, because in double 0.3 / 0.2 = 1.49999999
Math.Round( 1.5 ) = 2

3

У вас есть функция Math.Round, которая делает именно то, что вы хотите.

Math.Round(1.1) results with 1
Math.Round(1.8) will result with 2.... and so one.

1
А 1.5как насчет стоимости? Вам нужно больше параметров.
Only Bolivian Here

2

это будет округлено до ближайшего 5 или не изменится, если оно уже делится на 5

public static double R(double x)
{
    // markup to nearest 5
    return (((int)(x / 5)) * 5) + ((x % 5) > 0 ? 5 : 0);
}

2

Я искал это, но мой пример заключался в том, чтобы взять число, такое как 4,2769, и поместить его в промежуток как просто 4,3. Не совсем то же самое, но если это поможет:

Model.Statistics.AverageReview   <= it's just a double from the model

Затем:

@Model.Statistics.AverageReview.ToString("n1")   <=gives me 4.3
@Model.Statistics.AverageReview.ToString("n2")   <=gives me 4.28

и т.д...


Я использую этот ваш метод, потому что мне также нужна строка, и .ToString ("n0") позаботится об округлении для меня: 1.5m.ToString ("n0") // возвращает "2"
Натан Пратер



0

Если вы работаете с целыми числами, а не с числами с плавающей запятой, вот способ.

#define ROUNDED_FRACTION(numr,denr) ((numr/denr)+(((numr%denr)<(denr/2))?0:1))

Здесь и «numr», и «denr» являются целыми числами без знака.


0

Использование Math.Round(number)округления до ближайшего целого числа.


0

Напишите свой собственный метод раунда. Что-то вроде,

function round(x) rx = Math.ceil(x) if (rx - x <= .000001) return int(rx) else return int(x) end


-1
decimal RoundTotal = Total - (int)Total;
if ((double)RoundTotal <= .50)
   Total = (int)Total;
else
   Total = (int)Total + 1;
lblTotal.Text = Total.ToString();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.