Cómo redondear al número entero más cercano en C #


Respuestas:


200

Consulte la documentación oficial para obtener más información. Por ejemplo:

Básicamente le das al Math.Roundmétodo tres parámetros.

  1. El valor que desea redondear.
  2. El número de decimales que desea mantener después del valor.
  3. Un parámetro opcional que puede invocar para utilizar el redondeo AwayFromZero. ( ignorado a menos que el redondeo sea ambiguo, por ejemplo, 1,5 )

Código de muestra:

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

Demo en vivo

Necesita MidpointRounding.AwayFromZerosi desea redondear un valor de .5. Desafortunadamente, este no es el comportamiento predeterminado de Math.Round(). Si utiliza MidpointRounding.ToEven(el valor predeterminado), el valor se redondea al número par más cercano ( 1.5se redondea a 2, pero 2.5también se redondea a 2).


14
por otro lado, usar away from zerotambién significa que -1.5redondeará a -2.
Davogotland

2
use Math.Ceiling, no es una buena práctica usar Math.Round para las fricciones, lea: stackoverflow.com/questions/9221205/… ,
Yakir Manor

3
Encuentro que Math.Round (1.5, 0) devuelve 2
David Sykes

@davogotland es su de todos modos para redondear 137,5 a 140 no a 138? Me refiero a redondear a la décima más cercana.
sam

1
@sam tal vez dividir por 10, luego redondear con Math.Ceiling y finalmente multiplicar por 10?
Davogotland

63
Math.Ceiling

siempre redondea (hacia el techo)

Math.Floor

siempre redondea hacia abajo (hacia el suelo)

lo que buscas es simplemente

Math.Round

que rondas según esta publicación


¿Es su de todos modos redondear 137,5 a 140 no a 138? Me refiero a redondear a la décima más cercana.
sam

7

Necesitas Math.Round, no Math.Ceiling. Ceilingsiempre "redondea" hacia arriba, mientras que Roundredondea hacia arriba o hacia abajo según el valor después del punto decimal.


6

hay este manual, y también una forma un poco linda:

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

simplemente agregue 0.5 a cualquier número, y échelo a int (o al piso) y se redondeará matemáticamente correctamente: D


Todavía parece sospechoso. En primer lugar, la pregunta se refiere a redondear hacia arriba y en segundo lugar, cuando lo probé hace un momento, la implementación predeterminada de Math.Round (1.5) rondas a 2. Así que esto puede no ser lo que quería.
ver

Además, su ejemplo mezcla el punto decimal con la coma decimal. ¿Cuál usas normalmente (en Suecia, supongo)? :)
ver

Ups ... oh sí, lo siento. en la programación del punto decimal, por supuesto, pero en el texto formal usamos la coma decimal. y sí, suecia ^^ sobre la pregunta y la parte de "redondeo": creo que es solo un error de lenguaje. en los ejemplos dados por op, algunos números decimales se redondean hacia abajo.
Davogotland

@Siempre que no redondeo con Math.Round, lo hago con un yeso. es por eso que esta manera es manual y un poco linda;)
davogotland

5

Puede usar Math.Round como otros han sugerido (recomendado), o puede agregar 0.5 y convertir a un int (que eliminará la 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

Simplemente un recordatorio. Cuidado con el doble.

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

3

Tienes la función Math.Round que hace exactamente lo que quieres.

Math.Round(1.1) results with 1
Math.Round(1.8) will result with 2.... and so one.

1
¿Qué pasa 1.5con el valor? Necesita más parámetros.
Solo bolivianos aquí

2

esto se redondeará al 5 más cercano o no cambiará si ya es divisible por 5

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

2

Estaba buscando esto, pero mi ejemplo fue tomar un número, como 4.2769 y colocarlo en un intervalo como solo 4.3. No es exactamente lo mismo, pero si esto ayuda:

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

Luego:

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

etc ...


Estoy usando este método porque también necesito una cadena y .ToString ("n0") se encarga de redondear por mí: 1.5m.ToString ("n0") // devuelve "2"
Nathan Prather



0

Si trabaja con números enteros en lugar de números de punto flotante, este es el camino.

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

Aquí tanto "numr" como "denr" son enteros sin signo.



0

Escribe tu propio método circular. 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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.