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 escamoso – 2
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.