2009-07-30 9 views
8

El resultado de todas las ecuaciones de división en el siguiente bucle for es 0. ¿Cómo puedo conseguir que me da un ejemplo decimales:¿Por qué estas ecuaciones de división resultan en cero?

297/315 = 0.30793650793650793650793650793651 

Código:

using System; 

namespace TestDivide 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      for (int i = 0; i <= 100; i++) 
      { 
       decimal result = i/100; 
       long result2 = i/100; 
       double result3 = i/100; 
       float result4 = i/100; 
       Console.WriteLine("{0}/{1}={2} ({3},{4},{5}, {6})", i, 100, i/100, result, result2, result3, result4); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

Respuesta:

Gracias Jon y todo el mundo, esto es lo que quería hacer:

using System; 

namespace TestDivide 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int maximum = 300; 

      for (int i = 0; i <= maximum; i++) 
      { 
       float percentage = (i/(float)maximum) * 100f; 
       Console.WriteLine("on #{0}, {1:#}% finished.", i, percentage); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

Respuesta

29

Estás usando int/int, que hace todo en aritmética entera, incluso si usted está asignando a un decimal/doble/flotar variables .

Fuerce uno de los operandos para que sea del tipo que desea utilizar para la aritmética.

for (int i = 0; i <= 100; i++) 
{ 
    decimal result = i/100m; 
    long result2 = i/100; 
    double result3 = i/100d; 
    float result4 = i/100f; 
    Console.WriteLine("{0}/{1}={2} ({3},{4},{5}, {6})", 
         i, 100, i/100d, result, result2, result3, result4); 
} 

Resultados:

0/100=0 (0,0,0, 0) 
1/100=0.01 (0.01,0,0.01, 0.01) 
2/100=0.02 (0.02,0,0.02, 0.02) 
3/100=0.03 (0.03,0,0.03, 0.03) 
4/100=0.04 (0.04,0,0.04, 0.04) 
5/100=0.05 (0.05,0,0.05, 0.05) 

(etc)

Tenga en cuenta que no es que que muestra el valor exacto representado por el flotador o el doble - que no puede representan 0.01 exactamente como un flotador o doble, por ejemplo. El formato de cadena está efectivamente redondeando el resultado. Consulte mi article on .NET floating binary point para obtener más información, así como una clase que le permitirá ver el valor exacto de de un doble.

No me he molestado en usar 100L para result2 porque el resultado siempre sería el mismo.

0

Porque i es un valor int y lo divide por un número entero, por lo que el resultado es un número entero. y lo que es necesario dividir por 100,0 tener una conversión implícita en el flotador o especificar 100F o 100d

11

Trate

i/100.0 
+0

+1. Es así de simple;) – AnthonyWJones

+0

Esta respuesta me daría un voto positivo si también explicara * por qué * esto funcionaría; o) –

+0

El código de las preguntas no funciona porque "/" - el operador al que se llama con números enteros hace números enteros división. Si alguno de los argumentos es flotante o doble, entonces "/" hace la división esperada. : 0) – Lloyd

5

porque i es un int: división entera i/100 lleva a cabo, entonces el resultado , que siempre es 0, se convierte al tipo de destino. Es necesario especificar al menos un int no literal en su expresión:

i/100.0 
2

Debido a que i es un número entero y el 100 es un número entero ... por lo que tiene una división entera

Try (decimal) i/100,0 lugar

1

No importa dónde lo guarda, un número entero dividido por un entero siempre será un número entero.

0

esto es la división entera sea cual sea el tipo de variable que almacenar en, modo int/int = int

0
double result3 = ((double)i)/100; 
1

Es necesario para forzar una operación de punto flotante "doble/doble" en lugar de un "int/int"

double result = (double)297/(double)315 ; 
5

sé que este no es el punto de la pregunta ... pero creo que 297,0/315 es ,942857142857143 en lugar de 0,30793650793650793650793650793651.

:)

0

En mi caso, yo sólo tenía Vars y sin int

float div = (var1 - var2)/float.Parse(var1.ToString()); 
Cuestiones relacionadas