Frage

Wie kommt es Dividieren zwei 32-Bit-int Zahlen wie (int / int) gibt mir 0, aber wenn ich Decimal.Divide() verwende ich die richtige Antwort? Ich bin keineswegs ein c # Kerl bedeutet.

War es hilfreich?

Lösung

int eine ganze Zahl Typ; zwei ints Dividieren führt einen integer Abteilung, das heißt der Bruchteil abgeschnitten wird, da es nicht in dem Ergebnistyp gespeichert werden kann (auch int!). Decimal, hat dagegen einen Bruchteil bekommt. Durch Aufruf Decimal.Divide, erhalten Sie Ihre int Argumente implizit Decimals umgewandelt.

Sie können nicht-ganzzahlige Teilung auf int Argumente erzwingen, indem zumindest eines der Argumente auf eine Fließkommatyp explizit Gießen, z.

int a = 42;
int b = 23;
double result = (double)a / b;

Andere Tipps

Im ersten Fall, Sie tun Integer-Division, so das Ergebnis abgeschnitten wird (der Dezimalteil wird abgehackt) und eine ganze Zahl zurückgegeben wird.

Im zweiten Fall werden die Ints ersten in Dezimalzahlen umgewandelt, und das Ergebnis ist eine Dezimalzahl. Daher sind sie nicht abgeschnitten und das richtige Ergebnis zu erhalten.

Die folgende Zeile:

int a = 1, b = 2;
object result = a / b;

... wird unter Verwendung von Integer-Arithmetik . Decimal.Divide auf der anderen Seite zwei Parameter des Typs Decimal, so wird die Teilung auf Dezimalwerte anstatt ganzzahlige Werte durchgeführt werden. Das entspricht dies:

int a = 1, b = 2;
object result = (Decimal)a / (Decimal)b;

Um dies zu untersuchen, können Sie die folgenden Codezeilen nach jedem der obigen Beispiele hinzuzufügen:

Console.WriteLine(result.ToString());
Console.WriteLine(result.GetType().ToString());

Der Ausgang im ersten Fall wird

0
System.Int32

.. und im zweiten Fall:

0,5
System.Decimal

I Decimal.Divide(decimal, decimal) rechnen implizit konvertiert ihre Argumente int 2 in Dezimalzahlen vor einen Dezimalwert (präzise), wobei als 4/5 der Rückkehr als ganzzahlige Division behandelt und gibt 0

Sie möchten die Zahlen werfen:

double c = (double) a / (Doppel) b;

Hinweis: Wenn eines der Argumente in C # eine doppelt so hoch ist, wird eine doppelte Spaltung verwendet, die in einem Doppel zur Folge hat. So würde die folgende Arbeit zu:

double c = (double) a / b;

Hier ist ein kleines Programm:

static void Main(string[] args)
        {
            int a=0, b = 0, c = 0;
            int n = Convert.ToInt16(Console.ReadLine());
            string[] arr_temp = Console.ReadLine().Split(' ');
            int[] arr = Array.ConvertAll(arr_temp, Int32.Parse);
            foreach (int i in arr)
            {
                if (i > 0) a++;
                else if (i < 0) b++;
                else c++;
            }
            Console.WriteLine("{0}", (double)a / n);
            Console.WriteLine("{0}", (double)b / n);
            Console.WriteLine("{0}", (double)c / n);
            Console.ReadKey();
        }

Wenn Sie für 0

In meinem Fall nichts oben gearbeitet.

, was ich will ist 278 von 575 tun, zu teilen und vermehren um 100 Prozent zu finden.

double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);

%: 48,3478260869565 -> 278/575 ---> 0 %: 51,6521739130435 -> 297/575 ---> 0

, wenn ich die PeopleCount um 1,0 multiplizieren es macht es dezimal und Division 48.34 sein wird ... multiplizieren auch von 100,0 nicht 100.

Die Antwort als solche gekennzeichnet ist fast da, aber ich denke, dass es sich lohnt, fügte hinzu, dass es einen Unterschied zwischen der Verwendung von Doppel- und dezimal.

Ich würde einen besseren Job nicht tun, um die Konzepte als Wikipedia erklärt, so dass ich nur die Zeiger bieten:

Gleitkommaarithmetik

Dezimal-Datentyp

In den Finanzsystemen ist es oft erforderlich, dass wir eine bestimmte Anzahl von (Basis 10) Dezimalstellen Genauigkeit garantieren. Dies ist im allgemeinen nicht möglich, wenn die Eingabe / Quelldaten in Basis 10 sind, aber wir die Arithmetik in Basis 2 durch (da die Anzahl von Dezimalstellen, die für die Dezimaldarstellung einer Zahl auf der Basis abhängt; ein Drittel dauert unendlich viele decimal Orte in der Basis-10 als 0,333333 ... auszudrücken, aber es braucht nur eine Dezimalstelle in der Basis-3: 0,1).

Gleitkommazahlen ist schneller mit der Arbeit (in Bezug auf CPU-Zeit; Programmierung weist sie ebenso einfach sind) und dann bevorzugt, wenn Sie möchten, Rundungsfehler minimieren (wie in wissenschaftlichen Anwendungen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top