2009-07-30 13 views
8

Das Ergebnis all der Teilungsgleichungen in der unten for-Schleife ist 0. Wie kann ich es mir eine Dezimalzahl zB zu geben, erhalten:Warum ergeben diese Division Gleichungen in Null?

297/315 = 0.30793650793650793650793650793651 

Code:

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(); 
     } 
    } 
} 

Antwort:

Dank Jon und jeder, das ist, was ich tun wollte:

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(); 
     } 
    } 
} 

Antwort

29

Sie verwenden int/int, die selbst alles in Integer-Arithmetik tut, wenn Sie in eine Dezimalzahl sind zuweisen/double/float Variable .

Erzwingen Sie, dass einer der Operanden vom Typ ist, den Sie für die Arithmetik verwenden möchten.

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); 
} 

Ergebnisse:

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)

Beachten Sie, dass das nicht ist, den genauen Wert repräsentiert durch den Schwimmer oder Doppel zeigt - Sie kann nicht darstellen 0,01 genau wie ein Schwimmer oder Doppel, zum Beispiel. Die String-Formatierung rundet das Ergebnis effektiv ab. Sehen Sie meine article on .NET floating binary point für weitere Informationen sowie eine Klasse, die Sie den genauen Wert von einem Doppel sehen können.

Ich habe nicht mit 100L für result2 belästigt, weil das Ergebnis immer das gleiche wäre.

0

Weil i ein int Wert ist und Sie durch eine ganze Zahl dividieren, so ist das Ergebnis eine ganze Zahl! und so müssen Sie durch 100,0 teilen eine implizite Umwandlung in float haben oder geben Sie 100f oder 100d

11

Versuchen

i/100.0 
+0

+1. Es ist so einfach;) – AnthonyWJones

+0

Diese Antwort würde eine Verbesserung von mir bekommen, wenn es auch erklärt * warum * das würde funktionieren; o) –

+0

Code von den Fragen funktioniert nicht, weil "/" - Operator mit ganzzahligen Argumenten aufgerufen wird Ganzzahl division.Wenn eines der Argumente float oder double ist, dann übernimmt "/" die Division, die Sie erwarten. : 0) – Lloyd

5

weil i ist ein int: i/100 führt Integer-Division, dann ist das Ergebnis , das ist immer 0, wird auf den Zieltyp geworfen. Sie müssen mindestens ein nicht-int wörtlichen in Ihrem Ausdruck geben:

i/100.0 
2

Weil ich eine ganze Zahl und 100 eine ganze Zahl ... so haben Sie eine Integer-Division

Try (dezimal) i/100,0 statt

1

Egal wo Sie es speichern, eine ganze Zahl, dividiert durch Eine ganze Zahl wird immer eine ganze Zahl sein.

0

dies ist Integer-Division unabhängig von der Art der Variable, die Sie bei der Speicherung, so int/int = int

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

Sie benötigen einen Gleitkommaoperation "double/double" anstelle eines „int/Kraft int“

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

ich weiß, dass dies nicht der Punkt der Frage ist ... aber ich denke, dass 297,0/315 ,942857142857143 ist eher als 0,30793650793650793650793650793651.

:)

0

In meinem Fall hatte ich nur VARs und keine int

float div = (var1 - var2)/float.Parse(var1.ToString()); 
Verwandte Themen