while vectores sume sumar suma siguiente serie resueltos que programacion programa para números numeros los escribir entre ejercicios ejemplos con comprendidos calcule algoritmo c# .net casting

vectores - ¿Cuál es la mejor manera de crear un valor de porcentaje a partir de dos enteros en C#?



suma de n numeros en c++ con while (8)

Tengo dos enteros que quiero dividir para obtener un porcentaje.

Esto es lo que tengo ahora:

int mappedItems = someList.Count(x => x.Value != null); int totalItems = someList.Count(); (int)(((double)mappedItems /(double) totalItems) * 100)

Esto da la respuesta correcta. Pero eso es mucho casting para hacer algo tan simple como obtener un porcentaje entre dos números.

¿Hay una mejor manera de hacer esto? ¿Algo que no implique el casting?


¿Qué tal solo mappedItems * 100.0 / totalItems y lanzar esto al tipo apropiado?


Bueno, asumiendo que tus cuentas son más pequeñas que int.MaxValue:

int percent = mappedItems * 100 / totalItems;


La forma correcta solo para enteros de obtener el porcentaje con el redondeo adecuado es:

int result = ( mappedItems * 200 + totalItems ) / ( totalItems * 2 );

¿Cómo llegamos allí? Si hacemos esto en punto flotante, sería Math.Floor( mappedItems * 100.0 / totalItems + 0.5 ) . Necesitamos transformar esta fórmula para que sea solo de números enteros multiplicando y dividiendo 0.5 por totalItems, luego moviendo 0.5 * totalItems en dividendos, y luego multiplicando dividendo y divisor por 2 para hacer que las fracciones desaparezcan:

mappedItems * 100.0 / totalItems + 0.5 => mappedItems * 100.0 / totalItems + totalItems * 0.5 / totalItems => (mappedItems * 100.0 + 0.5 * totalItems) / totalItems => (mappedItems * 200.0 + totalItems) / (totalItems * 2).

En este punto, la fórmula es solo entero. Cuando hacemos la división de enteros, obtenemos un resultado de piso, por lo que el resultado de solo enteros es equivalente al mencionado punto flotante.


Puede obtener un resultado correctamente redondeado utilizando solo operaciones de enteros:

int percent = (200 * mappedItems + 1) / (totalItems * 2);

Al multiplicar por dos, sumar uno y dividir por dos, efectivamente estás agregando un medio. Esto hace que la división entera haga un redondeo en lugar de truncar.


Puede usar (mappedItems * 100) / totalItems pero esto siempre se redondearía hacia abajo. El método que has utilizado es mejor. ¿Por qué no envolver el código como un método?


Si solo quisieras evitar los moldes, podrías escribir:

(100 * mappedItems) / totalItems

pero eso se desbordará rápidamente cuando mappedItems > int.MaxValue / 100 .

Y ambos métodos redondean el porcentaje hacia abajo. Para obtener el redondeo correcto, mantendría el resultado como un doble:

((double)mappedItems /(double) totalItems) * 100


Solo para agregar eso, ya que tiene int s y desea calcular el porcentaje (un valor de punto flotante) que tendrá que realizar la conversión. Ya sea explícito como en C # o implícito como en algunos lenguajes de scripting, el elenco todavía ocurrirá. Es mejor hacerlo explícito.

Si desea menos conversiones por línea de código, puede escribir:

double mappedItems = (double)someList.Count(x => x.Value != null); double totalItems = (double)someList.Count(); double percentage = (mappedItems / totalItems) * 100.0);

Aunque como otros lo han señalado, verifique que los elementos totalItems sean 0 (preferiblemente antes de doblar) para evitar una división por cero.


prueba esto:

int mappedItems = someList.Count(x => x.Value != null); int totalItems = someList.Count(); int percent = Convert.ToInt32(complete * 100.0 / total);

en este ejemplo, obtendrías un resultado siendo "50"

int mappedItems = 14; int totalItems = 28; int result = Convert.ToInt32(mappedItems * 100.0 / totalItems); // result is 50