Como arredondar para o número inteiro mais próximo em C #

92

Como posso arredondar os valores para o número inteiro mais próximo?

Por exemplo:

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

"Math.Ceiling ()" não está me ajudando. Alguma ideia?

Usuário SOF
fonte
Math.Round () pode fazer o truque.
Apenas boliviano aqui

Respostas:

200

Veja a documentação oficial para mais. Por exemplo:

Basicamente, você dá ao Math.Roundmétodo três parâmetros.

  1. O valor que você deseja arredondar.
  2. O número de decimais que você deseja manter após o valor.
  3. Um parâmetro opcional que você pode invocar para usar o arredondamento AwayFromZero. ( ignorado a menos que o arredondamento seja ambíguo, por exemplo, 1,5 )

Código de amostra:

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

Demonstração ao vivo

Você precisa MidpointRounding.AwayFromZerose quiser que um valor 0,5 seja arredondado para cima. Infelizmente, este não é o comportamento padrão para Math.Round(). Se estiver usando MidpointRounding.ToEven(o padrão), o valor é arredondado para o número par mais próximo ( 1.5é arredondado para 2, mas 2.5também é arredondado para 2).

Só boliviano aqui
fonte
14
por outro lado, usar away from zerotambém significa que -1.5arredondará para -2.
davogotland
2
usar Math.Ceiling, não é uma boa prática usar Math.Round para atritos, leia: stackoverflow.com/questions/9221205/… ,
Yakir Manor
3
Estou descobrindo que Math.Round (1.5, 0) retorna 2
David Sykes de
@davogotland é mesmo assim arredondar 137,5 a 140 e não 138? Quer dizer, arredondar para o décimo mais próximo?
sam
1
@sam talvez divida por 10, depois arredonde com Math.Ceiling e, finalmente, multiplique por 10?
Davogotland
63
Math.Ceiling

sempre arredonda para cima (em direção ao teto)

Math.Floor

sempre arredonda para baixo (em direção ao chão)

o que você busca é simplesmente

Math.Round

que ronda de acordo com esta postagem

devrooms
fonte
é mesmo assim para arredondar 137,5 a 140 e não a 138? Quer dizer, arredondar para o décimo mais próximo?
sam
7

Você precisa Math.Round, não Math.Ceiling. Ceilingsempre "arredonda" para cima, enquanto Roundarredonda para cima ou para baixo, dependendo do valor após o ponto decimal.

dasblinkenlight
fonte
6

tem este manual, e um jeito meio fofo também:

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);

simplesmente adicione 0,5 a qualquer número e lance-o para int (ou base) e ele será arredondado matematicamente de maneira correta: D

Davogotland
fonte
Ainda parece suspeito. Em primeiro lugar, a questão pergunta sobre o arredondamento para cima e em segundo lugar, quando eu tentei apenas agora, a implementação padrão de Math.Round (1,5) rodadas para 2. Portanto, este pode não ser o que ele queria.
ver
além disso, seu exemplo mistura vírgula decimal com vírgula decimal. Qual você normalmente usa (na Suécia, eu acho)? :)
ver
oops ... oh sim, desculpe. na programação do ponto decimal, é claro, mas no texto formal usamos a vírgula decimal. e sim, Suécia ^^ sobre a questão e a parte "arredondamento": acho que é apenas um erro de linguagem. nos exemplos dados por op, alguns números decimais são arredondados para baixo.
Davogotland
@ver eu não arredondar para baixo com Math.Round, faço-o com um gesso. é por isso que esse jeito é manual e meio fofo;)
davogotland
5

Você pode usar Math.Round como outros sugeriram (recomendado), ou você pode adicionar 0,5 e converter para um int (o que eliminará a parte decimal).

double value = 1.1;
int roundedValue = (int)(value + 0.5); // equals 1

double value2 = 1.5;
int roundedValue2 = (int)(value2 + 0.5); // equals 2
Marlon
fonte
5

Apenas um lembrete. Cuidado com o dobro.

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

Você tem a função Math.Round que faz exatamente o que você deseja.

Math.Round(1.1) results with 1
Math.Round(1.8) will result with 2.... and so one.
user496607
fonte
1
E 1.5quanto ao valor? Você precisa de mais parâmetros.
Somente boliviano aqui
2

isso será arredondado para o próximo 5 ou não mudará se já for divisível por 5

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

Eu estava procurando por isso, mas meu exemplo foi pegar um número, como 4,2769 e soltá-lo em um intervalo de apenas 4,3. Não é exatamente o mesmo, mas se isso ajudar:

Model.Statistics.AverageReview   <= it's just a double from the model

Então:

@Model.Statistics.AverageReview.ToString("n1")   <=gives me 4.3
@Model.Statistics.AverageReview.ToString("n2")   <=gives me 4.28

etc ...

user2970629
fonte
Estou usando este seu método porque também preciso de uma string e .ToString ("n0") cuida do arredondamento para mim: 1,5m.ToString ("n0") // retorna "2"
Nathan Prather
1

Use Math.Round:

double roundedValue = Math.Round(value, 0)
Thomas Levesque
fonte
1
var roundedVal = Math.Round(2.5, 0);

Isso dará resultado:

var roundedVal = 3
Ankita_systematix
fonte
0

Se você está trabalhando com inteiros em vez de números de ponto flutuante, aqui está o caminho.

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

Aqui ambos "numr" quanto "denr" são inteiros sem sinal.

Sarath Kumar
fonte
0

Usando Math.Round(number)rodadas para o número inteiro mais próximo.

codejockie
fonte
0

Escreva seu próprio método de rodada. Algo como,

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

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