Как округлить до ближайшего целого числа в 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.28etc...
Если вы работаете с целыми числами, а не числа с плавающей запятой, вот так.
#define ROUNDED_FRACTION(numr,denr) ((numr/denr)+(((numr%denr)<(denr/2))?0:1))здесь "numr" и "denr" являются целыми числами без знака.