Як округлити до найближчого цілого числа в C #


92

Як я можу округлити значення до найближчого цілого числа?

Наприклад:

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

"Math.Ceiling ()" мені не допомагає. Якісь ідеї?


Math.Round () може зробити трюк.
Тільки болівійська тут

Відповіді:


200

Більше див. В офіційній документації . Наприклад:

В основному ви даєте 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).


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?
davogotland

63
Math.Ceiling

завжди округлюється (до стелі)

Math.Floor

завжди округляється вниз (до підлоги)

те, що ви шукаєте, - це просто

Math.Round

який раунди відповідно до цього повідомлення


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

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. Отже, це може бути не те, що він хотів.
вер

також, ваш приклад змішує десяткову крапку з десятковою комою. Яким із них ви зазвичай користуєтесь (мабуть, у Швеції)? :)
вер

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

@ver я не заокручую з Math.Round, я роблю це з акторським складом. ось чому цей спосіб є ручним та
певним

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


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,5 м. 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.