2012-02-15 11 views
22

estoy teniendo este sencillo cálculo regresar cero no puede averiguarlodevuelve cero

decimal share=(18/58)*100; 

Respuesta

31

Usted está trabajando con números enteros aquí. Intenta usar decimales para todos los números en tu cálculo.

decimal share = (18m/58m)*100m; 
+0

No está intrínsecamente claro por qué el literal "18" se compila en un número entero. Para aclarar, según la especificación del lenguaje (Estructura léxica> Tokens> Literales), cualquier literal escrito usando los "dígitos decimales" del 0 al 9 es [Integer Literals] (https://msdn.microsoft.com/en-us/library/aa664674) (v = vs.71) .aspx) que se compilan en "el primero de estos tipos en que se puede representar su valor:' int', 'uint',' long', 'ulong'.", una vez que agregue el " m "sufijo el literal ahora se ve como [Real Literal] (https://msdn.microsoft.com/en-us/library/aa691085 (v = vs.71) .aspx) que compila como tipo' decimal'. – Quantic

+0

Ejemplo: 'var check = (1/(decimal) 7) * 100 = 14.285714' la conversión del denominador a decimal resolverá el problema. – Vijayaraghavan

20

18/58 es una división entera, lo que resulta en 0.

Si desea una división decimal, es necesario para usar literales decimales:

decimal share = (18m/58m) * 100m; 
+2

Bueno, eso es nuevo para mí Solo estaba siguiendo mi calculadora. –

3

Porque los números son enteros y usted realiza la división de enteros.

18/58 es 0 en la división de números enteros.

7

Dado que algunas personas están vinculadas a esto de prácticamente cualquier subproceso donde el resultado del cálculo es un 0, estoy agregando esto como una solución ya que no todas las demás respuestas se aplican a los escenarios de casos.

El concepto de tener que hacer cálculos en varios tipos para obtener ese tipo como resultado se aplica, sin embargo, arriba solo muestra 'decimal' y usa su forma abreviada como 18m como una de las variables a calcular.

// declare and define initial variables. 
int x = 0; 
int y = 100; 

// set the value of 'x'  
x = 44; 

// Results in 0 as the whole number 44 over the whole number 100 is a 
// fraction less than 1, and thus is 0. 
Console.WriteLine((x/y).ToString()); 

// Results in 0 as the whole number 44 over the whole number 100 is a 
// fraction less than 1, and thus is 0. The conversion to double happens 
// after the calculation has been completed, so technically this results 
// in 0.0 
Console.WriteLine(((double)(x/y)).ToString()); 

// Results in 0.44 as the variables are cast prior to calculating 
// into double which allows for fractions less than 1. 
Console.WriteLine(((double)x/(double)y).ToString()); 
1

Siempre que me encuentro con este tipo de situaciones, sólo upCast el numerador.

double x = 12.0/23409; 
decimal y = 12m/24309; 

Console.WriteLine($"x = {x} y = {y}"); 
Cuestiones relacionadas