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


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


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


é 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.


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


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

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

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.

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

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 ...


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



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.


0

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


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


-1
decimal RoundTotal = Total - (int)Total;
if ((double)RoundTotal <= .50)
   Total = (int)Total;
else
   Total = (int)Total + 1;
lblTotal.Text = Total.ToString();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.