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


Как я могу округлить значения, как это:

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

Math.Ceiling() не помогает мне. Есть идеи?

15 68

15 ответов:

посмотреть официальная документация дополнительные. Например:

в основном вы даете 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 Если вы хотите .5 значение, которое необходимо округлить. К сожалению, это не поведение по умолчанию для Math.Round(). При использовании MidpointRounding.ToEven (по умолчанию) значение округляется до ближайшего даже номер (1.5 округляется до 2, а 2.5 также округляется до 2).

Math.Ceiling

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

Math.Floor

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

то, что вы после просто

Math.Round

который округляет согласно этот пост

есть это руководство, и вроде милый способ тоже:

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, а не Math.Ceiling. Ceiling всегда "округляет" вверх, в то время как Round округляет вверх или вниз в зависимости от значения после запятой.

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

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

вы можете использовать математику.Круглый, как другие предложили (рекомендуется), или вы можете добавить 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

у вас есть математика.Круглый функция, которая делает именно то, что вы хотите.

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

использовать Math.Round:

double roundedValue = Math.Round(value, 0)

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

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

Я искал это, но мой пример состоял в том, чтобы взять число, такое как 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

etc...

var roundedVal = Math.Round(2.5, 0);

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

var roundedVal = 3

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

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

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

С помощью Math.Round(number) округление до ближайшего целого числа.

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

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

decimal RoundTotal = Total - (int)Total;
if ((double)RoundTotal <= .50)
   Total = (int)Total;
else
   Total = (int)Total + 1;
lblTotal.Text = Total.ToString();