2010-08-05 15 views

Respuesta

18

5/100 se hace en aritmética entera, que da 0 antes de la conversión. Trate

double variable = 5.0/100; 

Si 5 está en una variable x (de tipo entero), a continuación, utilizar:

variable = (double)x/100; 

o

variable = ((double)x)/100; 

para hacer el intento claro (gracias John!)

o

variable = x/100.0; 
+3

-1 Uso inútil de 'Convert'. –

+2

Deshice mi voto ya que agregó un ejemplo correcto, pero todavía tiene malos ejemplos al usar 'Convert.ToDouble' en una expresión que * ya * es doble. ¿Por qué? –

+1

@Ben: Gracias, corregido (tenía prisa, lo siento) –

-3

Marco,

probar este lugar:

double variable = Convert.ToDouble((double)5/100); 

Jim

[finales de editar] - como se ha señalado (por los votantes silenciosos :)) el uso del Convert es redundante. Obviamente debe hacerse de una manera similar a las otras entradas. Reconozco eso, pero déjalo en la parte superior como un ejemplo de cómo bajar rápidamente la votación cuando respondas a una pregunta con prisa ... ¡¡que la precaución sea tu maestro !!

Además, como no sabemos si la variable vendrá de una cadena o un número, también debería considerar tryparse etc en el número 1 antes de hacer la aritmética.

+2

Uso inútil de 'Convert', y no obvio (¿el casting tiene prioridad sobre la división, o la división se hace primero?) –

+0

Ben - gracias por el voto a favor :-). Estoy respondiendo a su pregunta con una respuesta que coincida con su requisito previsto. no más, no menos .. –

+0

todos los 1111's - piernas once: 0 –

2

Porque 5/100 en la división de enteros es 0. Debe asegurarse de que está haciendo división en dobles.

2

5/100 es una aritmética de números enteros. Para tener doble precisión, uno o más de los valores deben ser dobles.

double result = 5.0/100.0; 
double result = 5.0/100; 
double result = 5/100.0; 
double result = (double)5/100; 
double result = 5/(double)100; 

o

double numerator = 5; 
double denominator = 100; 
double result = numerator/denominator; 
4

A diferencia del mundo real, las computadoras tratan operaciones matemáticas un poco diferente aunque no hay diferencia significativa una vez que entendemos por qué se comporta así.

1.) ¿Por qué se comporta así?

Tenga en cuenta que, los enteros son números enteros y las variables de tipo entero sólo puede almacenar números enteros y no pueden almacenar o reconocer los números decimales. cuando dice 5/100, tanto 5 como 100 son literales enteros para las computadoras y se llama división entera. El resultado debería ser 0.05 pero ya que esta es una división entera, el resultado también sería el número entero y como dije, los enteros no pueden almacenar valores decimales, la parte posterior después de "." (punto decimal) se ignora por completo y, por lo tanto, el resultado es 0.

Añadiendo más a esto, aunque está convirtiendo el resultado a doble, no hace ninguna diferencia porque antes de que se convierta realmente en un doble, el resultado ya es 0 y pasa a convertir el entero 0 al doble que finalmente resulta en 0.0.

2.) ¿Cómo obtener el resultado deseado?

Otras respuestas explican muy bien la solución, por lo que le pido que consulte esas respuestas en lugar de volver a inventar la rueda por usted.

Espero que esto ayude.

0

así que aquí sería mi revisada 'considerado' respuesta ...

ya que no saben qué 'tipo' de la variable está llegando como numerador, tendríamos que utilizar el Double.TryParse en ese. En el laboratorio, que podíamos cocinar algo como esto:

var numerator = "5"; // let's make it string to prove the point 
double parsedNumerator; 
int denominator = 100; // this could well be a constant 

double result; 
if(Double.TryParse(numerator, out parsedNumerator)) 
{ 
    // notice no casting or convert fluff 
    result = parsedNumerator/denominator; 
    // do something with the result 
} 
else 
{ 
    // warn that the numerator is doo-lallie 
} 

ahora escondido debajo de la mesa - por si acaso he pasado por alto algo más obvio !! :)

jim

Cuestiones relacionadas