Как округлить до ближайшего целого числа в C#
Как я могу округлить значения, как это:
1.1 => 1
1.5 => 2
1.9 => 2
Math.Ceiling()
не помогает мне. Есть идеи?
15 ответов:
посмотреть официальная документация дополнительные. Например:
в основном вы даете
Math.Round
метод трех параметров.
- значение, которое вы хотите округлить.
- количество десятичных знаков вы хотите сохранить после значения.
- необязательный параметр, который можно вызвать для использования округления 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...
Если вы работаете с целыми числами, а не числа с плавающей запятой, вот так.
#define ROUNDED_FRACTION(numr,denr) ((numr/denr)+(((numr%denr)<(denr/2))?0:1))
здесь "numr" и "denr" являются целыми числами без знака.