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

Ответы:

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большую сторону , в то время как округляет в большую или меньшую сторону в зависимости от значения после десятичной точки.

dasblinkenlight
источник
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
Kosmas
источник
3

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

Math.Round(1.1) results with 1
Math.Round(1.8) will result with 2.... and so one.
user496607
источник
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

и т.д...

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

Это даст результат:

var roundedVal = 3
Ankita_systematix
источник
0

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

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

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

Сарат Кумар
источник
0

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

codejockie
источник
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();
Сальма
источник