Есть ли способ для пола / потолка, основанный на том, превышает ли значение 0,5 или ниже? - PullRequest
3 голосов
/ 23 октября 2011

Я пытаюсь округлить свои значения так, чтобы, если оно равно 0.5 или больше, оно становится 1, иначе оно становится 0.Например:

3.7 -> 4;
1.3 -> 1;
2.5 -> 3;
...

Есть идеи?

Ответы [ 3 ]

7 голосов
/ 23 октября 2011
Math.Round(3.7,MidpointRounding.AwayFromZero);

http://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx

В приведенном выше примере я использовал AwayFromZero для округления, поскольку по умолчанию используется округление Банкира, поэтому, если дробь равна 0,5, она округляется до ближайшего четного.Таким образом, 3,5 становится 4 (ближайший четный), но 2,5 становится 2 (ближайший четный).Таким образом, вы выбираете другой метод, как показано выше, чтобы сделать 3,5 до 4 и от 2,5 до 3.

3 голосов
/ 23 октября 2011

Самый простой способ - добавить 0.5 к входу, затем привести к int.

2 голосов
/ 23 октября 2011

Я прибыл последним, поэтому скажу что-то другоеВы округлили 0.5 до 1, не используя double!Используйте decimal с.double нехорошо иметь "точные" цифры.

Запустите этот фрагмент кода и получайте удовольствие (обратите внимание, что есть / была "ошибка" в моно на числах вроде 0,49999999999999994 , поэтому для запуска его на ideone мне пришлось изменить егонемного, чтобы попытаться округлить 1,5: http://ideone.com/57XAYV)

public static void Main()
{
    double d = 1.0;
    d -= 0.3;
    d -= 0.2;

    Console.WriteLine("Standard formatting: {0}", d); // 0.5
    Console.WriteLine("Internal Representation: {0:r}", d); // 0.49999999999999994
    Console.WriteLine("Console WriteLine 0 decimals: {0:0}", d); // 1
    Console.WriteLine("0 decimals Math.Round: {0}", Math.Round(d, MidpointRounding.AwayFromZero)); // 0
    Console.WriteLine("15 decimals then 0 decimals Math.Round: {0}", Math.Round(Math.Round(d, 15, MidpointRounding.AwayFromZero), MidpointRounding.AwayFromZero)); // 1
}
...