2012-03-29 18 views
7

¿Las diferencias a continuación importan significativamente en C#?Prioridad de operación de conversión en C#

int a, b; 
double result; 
result = (double)a/b; 
result = a/(double)b; 
result = (double)a/(double)b; 

Cuál usas?

+0

Simplemente asegúrese de NO utilizar 'result = (double) (a/b);' –

+0

Ninguno de estos son necesarios. 'a' y' b' ya son dobles. la variable de resultado es un doble. Lo único que no será un doble es el resultado de la división de dos dobles. Si no me equivoco, hay un casting natural de entero a doule en un caso como este. –

+1

@Ramhound 'a' y' b' son enteros, no dobles. Hacer 'result = a/b' dará como resultado una división entera, luego un molde en doble. – Msonic

Respuesta

10

El lanzamiento ocurrirá antes de la división.

En sus ejemplos, no importa cuál haga, como si un solo operando fuera un doble, el tiempo de ejecución también convertirá el otro en un doble.

Esto parece una micro-optimización, no es algo que valga la pena preocuparse o tratar a menos que las mediciones muestren que es realmente un cuello de botella.

+0

Mi principal preocupación es la precisión al final del cálculo. Temía que cualquiera que eligiera lanzar (primero, explícitamente) hiciera la diferencia. Pero ya que dices que los internos los echarán a todos, confiaré en ti. – Jake

+0

@Jake - confía, pero verifica ... Esto es algo que puedes _easily_ probar por tu cuenta (solo escribe una pequeña aplicación que haga los diferentes tipos de cálculos). – Oded

+1

En realidad, la pequeña aplicación no probará nada. Un pequeño subconjunto de operandos de prueba no puede representar el resultado para todos los operandos posibles, a menos que primero se determine que se implementa como tal. Por lo tanto, tuve que hacer esta pregunta. – Jake

2

hago esto:

result = (double)a/(double)b; 

Puede ser estrictamente necesario, pero por lo general lo que desee hacer seguro de que no va a hacer la división entera, y no me importa recordar las normas específicas para este escenario, por lo que es más fácil (si unas pocas teclas más) para ser explícito.

+0

En realidad, estoy haciendo esto * porque * no me molesto en recordar los detalles. Pero decido cambiar mis hábitos de holgazanería, por lo tanto, hice esta pregunta. (por cierto, no te di el -1) – Jake

+0

@Jake bueno para ti, ¡tratando de controlar los hábitos perezosos! :) –

0

Hago (double)a/b porque me imagino un int para ser algo indivisible como una roca o algo así. Cuando se lanza a un doble, se vuelve divisible, como un pastel. Puede dividir 3.0 tortas en cuatro partes, pero no puede dividir tres rocas en 4.0 partes. O algo. ¿Tiene algún sentido?