Codifiqué algunas cosas de cálculo (copié debajo de un ejemplo realmente simplificado de lo que hice) como CASE2 y obtuve malos resultados. Refactorizado el código como CASE1 y funcionó bien. Sé que hay un elenco implícito en CASO 2, pero no estoy seguro del motivo completo. Cualquiera me podría explicar lo que está pasando exactamente debajo?Explicación de conversión/conversión int/double en C#
//CASE 1, result 5.5
double auxMedia = (5 + 6);
auxMedia = auxMedia/2;
//CASE 2, result 5.0
double auxMedia1 = (5 + 6)/2;
//CASE 3, result 5.5
double auxMedia3 = (5.0 + 6.0)/2.0;
//CASE 4, result 5.5
double auxMedia4 = (5 + 6)/2.0;
Mi suposición es que/2 en CASE2 está lanzando (5 + 6) a int y causando ronda de división a 5, a continuación fundido de nuevo para doblar y convertido a 5,0.
CASE3 y CASE 4 también solucionan el problema.
Como nota al margen; solo hay * una * operación realizada en tiempo de ejecución aquí. El '/ 2' en el caso 1. El resto lo hace el compilador. –
@Marc: ¿no puede el compilador incluso realizar el caso 1 completamente en tiempo de compilación, ya que 'auxMedia' es local y se le asigna una constante? ¿O es una optimización que queda estrictamente para el JIT? –
@Michael - Esperaría * que se lo dejara al JIT. Para responderlo, necesitaría ver diferentes salidas del compilador ... –