Saltar al contenido

¿Cómo redondear al entero par más cercano?

este problema se puede abordar de diferentes formas, pero nosotros te compartimos la que en nuestra opinión es la respuesta más completa.

Solución:

Prueba esto (utilicemos Math.Round con MidpointRounding.AwayFromZero para obtener”Siguiente valor uniforme” pero escamoso2 factor):

double source = 1123.0;

// 1124.0
double result = Math.Round(source / 2, MidpointRounding.AwayFromZero) * 2;

Manifestación:

double[] tests = new double[] 
     1.0,
  1123.1,
  1123.0,
  1122.9,
  1122.1,
  1122.0,
  1121.5,
  1121.0,
;

string report = string.Join(Environment.NewLine, tests
  .Select(item => $"item,6:F1 -> Math.Round(item / 2, MidpointRounding.AwayFromZero) * 2"));

Console.Write(report);

Salir:

   1.0 -> 2     // In case of tie, next even value
1123.1 -> 1124
1123.0 -> 1124  // In case of tie, next even value
1122.9 -> 1122
1122.1 -> 1122
1122.0 -> 1122
1121.5 -> 1122
1121.0 -> 1122  // In case of tie, next even value

Un trazador de líneas:

double RoundToNearestEven(double value) =>
    Math.Truncate(value) + Math.Truncate(value) % 2;

Violín

Explicación: si tenemos un número par con algunos dígitos después del punto flotante, solo debemos deshacernos de esos dígitos. Si tenemos un número impar, debemos hacer lo mismo y luego pasar al siguiente número entero que está garantizado que es par.

PD Gracias a @DmitryBychenko por señalar que lanzar doble a largo no es la idea más brillante.

La razón por la que obtiene el resultado 1123 incluso cuando usa

Math.Round(1122.5196d, 0, MidpointRounding.ToEven);

es porque eso es exactamente lo que le ha pedido al compilador que haga. Al redondear a pares con decimales, asegúrese de recordar que 1123.0 es par.

es decir. 1122.51 redondeado a par se convierte en 1123.0 (tenga en cuenta que como es un decimal, siempre mantendrá su lugar decimal y, por lo tanto, el .0 aquí lo convierte en un número par).

En cambio, escribiría una función para hacer esto, algo me gusta:

   private int round_up_to_even(double number_to_round)
    
        int converted_to_int = Convert.ToInt32(number_to_round);
        if (converted_to_int %2 == 0)  return converted_to_int; 
        double difference = (converted_to_int + 1) - number_to_round;
        if (difference <= 0.5)  return converted_to_int + 1; 
        return converted_to_int - 1;
    

Aquí tienes las comentarios y puntuaciones

Si haces scroll puedes encontrar las ilustraciones de otros sys admins, tú aún puedes mostrar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *