2010-11-12 9 views

Respuesta

19

Puede utilizar cualquiera de los siguientes toda dará 2.60869565217391:

double result = 60/23d; 
double result = 60d/23; 
double result = 60d/ 23d; 
double result = 60.0/23.0; 

Pero

double result = 60/23; //give 2 

Explicación:

si cualquiera de la serie es doble que dará un doble


EDIT:

Documentación

La evaluación de la expresión se realiza de acuerdo a las siguientes reglas:

  • Si uno de los los tipos de punto flotante son dobles, la expresión se evalúa como doble (o bool en el caso de expresiones relacionales o booleanas).

  • Si no hay un tipo doble en la expresión, se evalúa como flotante (o bool en el caso de expresiones relacionales o booleanas).

51

60 y 23 son literales enteros, por lo que está haciendo una división entera y luego asignándola a un doble. El resultado de la división entera es 2.

Trate

double result = 60.0/23.0; 

o equivalentemente

double result = 60d/23d; 

Cuando el sufijo d informa al compilador que significa que escribir un doble literal.

+4

Creo que esto debería marcarse como respuesta, ya que la explicación marcada como respuesta copió esto .. – Nick

+0

@ Nick, no lo copié si cree que lo estoy actualizando –

9

Se trabajará

double result = (double)60/(double) 23; 

o equivalentemente

double result = (double)60/23; 
+4

Aunque el compilador lo optimiza de manera propagable, este el código produce el comportamiento: tome el número entero 60 y luego vuélvalo a doble. Tome el número entero 23 y luego vuélvalo a doble. Divida los resultados de ambos moldes. Es mejor usar valores dobles en primer lugar (como en la respuesta de James Gaunt) – dbemerlin

+0

Sí, tienes razón +1 –

+0

Pero esto es solo (?) Forma si no estás tratando con números fijos, sino con variables enteras. – Jens

3

(doble) 60/23

+0

Nop, esto no funciona. – Simon

+3

De hecho, el tipo de conversión (doble) tiene una precedencia mayor que la división, y un doble dividido por una int resulta un doble. Pero 60.0/23.0 es más claro y, por lo tanto, una mejor respuesta. – Mania

+0

Veo, lo siento, extraño leerlo. Sí, funciona ... – Simon

3

no ha utilizado C# durante un tiempo, pero que se divide dos números enteros, los cuales por lo que recuerdo, el resultado es un número entero también.

Puede forzar sus literales numéricas para ser dobles por la adición de la letra "d", le gusta a:

double result = 60d/23d; 
+0

OK, esto funciona. Pero cómo hacerlo, si tengo esto: doble resultado = 60d /someList.Count; – Simon

+0

Use una función Convertir para el otro operando. Por ejemplo: Convert.ToDouble (someList.Count) –

+0

double result = 60d /System.Convert.ToDouble(someList.Count); –

3

doble resultado = 60,0/23,0;

2

Es una buena práctica para decorar correctamente números para su tipo apropiado. Esto evita no solo el error que está experimentando, sino que hace que el código sea más legible y mantenible.

double x = 100d; 
single x = 100f; 
decimal x = 100m; 
0

Para agregar a lo que se ha dicho hasta ahora ... 60/23 es una operación en dos constantes. El compilador reconoce el resultado como una constante y precomputa la respuesta. Como la operación tiene dos enteros, el compilador usa un resultado entero. La operación entera de 60/23 tiene un resultado de 2; por lo que el compilador eficaz crea el siguiente código:

double result = 2; 

Como se ha señalado ya, usted necesita decirle al compilador que no utilice números enteros, el cambio de uno o ambos de los operandos no entero conseguirá que el compilador usa una constante de punto flotante.

1

convertir el dividendo y el divisor en valores dobles, por lo que el resultado es doble
doble res = 60d/23d;

+1

¿Cuál es la diferencia con la respuesta ya dada y aceptada? – Oliver