2010-09-01 29 views
18

estoy haciendo un Calc y durante la depuración encontré esto:1/252 = 0 en C#?

double num = 1/252; 

cuando depurado esto, num se establece en cero (0). ¿Hay alguna razón para esto? Me gustaría que sea el cálculo real.

Gracias

+17

Eso es Jon Skeet que respondió a su pregunta. Ve enseñalo a todos tus amigos. Me gustaría. :) –

+0

posible duplicado de [División en C# que no avanza como esperaba] (http://stackoverflow.com/questions/2400799/division-in-c-not-going-the-way-i-expect) –

Respuesta

30

Sí - que el cálculo se está realizando en número entero aritmética. Prueba esto:

double num = 1.0/252.0; 

Básicamente, el tipo de la variable que el resultado se asigna a no afecta a la operación aritmética que se realiza. El resultado de dividir un entero por otro es un número entero; si desea utilizar la aritmética de punto flotante, debe hacer que uno u otro de los operandos sea un tipo de punto flotante. Una forma simple de hacerlo con literales es pegar ".0" al final. Otra alternativa es utilizar el sufijo d:

double num = 1d/252d; 

Tenga en cuenta que en realidad sólo necesita hacer una operando un valor de punto flotante para que funcione, pero para mayor claridad, probablemente haría lo tanto en este caso.

que es fácil de ver con literales, por supuesto, pero para otras expresiones (variables, los resultados de las llamadas a métodos, etc.) que había necesidad de usar un yeso:

int x = 1; 
int y = 252; 
double num = (double) x/(double) y; 

Una vez más, sólo es necesario para emitir uno de ellos, por lo que esto funcionaría también:

int x = 1; 
int y = 252; 
double num = (double) x/y; 

Tenga en cuenta que esto no es específico de la división - que afecta a los demás operadores aritméticos también.

+6

O , si tienes vars enteros, lanza uno de ellos al doble: (doble) a/b. –

+0

@Vadim: Sí, buen punto, lo editaré en. –

9

1 y 252 son enteros literales, por lo tanto, el cálculo usa matemática entera. 0 es el resultado entero más cercano. Use 1.0 o 252.0 para obtener el valor doble correcto.

7

estás dividiendo 2 enteros y echando a un doble,

tratar

double num = 1d/252d;