konvertiere double in int


156

Was ist der beste Weg, um ein doublein ein umzuwandeln int? Sollte eine Besetzung verwendet werden?


7
definiere "am besten". hängt davon ab, ob Sie eine Auf- / Abrundung usw.
wünschen

8
@ RPM1984: Definieren etc.:)
Armen Tsirunyan

18
@Armen - touche` :) Ist sowieso nicht wirklich wichtig - Skeet ist hier, nichts anderes ist wichtig.
RPM1984

Antworten:


237

Sie können eine Umwandlung verwenden, wenn Sie das Standardverhalten zum Abschneiden gegen Null wünschen. Alternativ können Sie verwenden möchten Math.Ceiling, Math.Round, Math.Floorusw. - obwohl Sie noch eine Besetzung danach benötigen.

Vergessen Sie nicht, dass der Bereich von intviel kleiner ist als der Bereich von double. Ein Cast von doublebis intlöst keine Ausnahme aus, wenn der Wert intin einem ungeprüften Kontext außerhalb des Bereichs von liegt , während ein Aufruf von Convert.ToInt32(double)will. Das Ergebnis der Umwandlung (in einem nicht aktivierten Kontext) ist explizit undefiniert, wenn der Wert außerhalb des Bereichs liegt.


24
@user: Die Größe von a intbeträgt immer 32 Bit, unabhängig davon, ob Sie einen 32- oder 64-Bit-Computer verwenden.
Joren

3
Und Doppel können viel größer sein als sogar ein 64-Bit-Int.
Adrian Ratnapala

7
Für C # Noobs wie mich: Sowohl Math als auch Convert sind Teil des Systems. Die vollständige Antwort sieht also so aus:intVal = System.Convert.ToInt32(System.Math.Floor(dblVal));
Kris

9
@ user1290746: Das würde funktionieren, aber Sie würden normalerweise nur using System;oben in der Datei haben, an welchem ​​Punkt es einfach sein könnteintVal = Convert.ToInt32(Math.Floor(dblVal));
Jon Skeet

3
@ user1290746: Aber in diesem Fall denke ich nicht, dass die richtige Lösung darin besteht, den Leuten zu raten, die vollqualifizierten Namen zu verwenden - die bessere Lösung besteht darin, sich über usingAnweisungen zu informieren .
Jon Skeet

39

Wenn Sie also cast verwenden, werden (int)SomeDoubleSie den Bruchteil abschneiden. Das heißt, wenn SomeDouble4.9999 wäre , wäre das Ergebnis 4, nicht 5. Die Konvertierung in int rundet die Zahl nicht. Wenn Sie Rundungen verwenden möchtenMath.Round


34

Ja, warum nicht?

double someDouble = 12323.2;
int someInt = (int)someDouble;

Die Verwendung der ConvertKlasse funktioniert auch gut.

int someOtherInt = Convert.ToInt32(someDouble);

7

Convert.ToInt32 ist der beste Weg, um zu konvertieren


Dies ist eine normalerweise unsichere Funktion, da sie nur alles akzeptiert.
Ant_222

4

Der beste Weg ist einfach zu verwenden Convert.ToInt32 . Es ist schnell und rundet auch richtig.

Warum es komplizierter machen?


2

Hier ist ein vollständiges Beispiel

class Example 
{    
  public static void Main() 
  {    
    double x, y; 
    int i; 

    x = 10.0; 
    y = 3.0; 

    // cast double to int, fractional component lost (Line to be replaced) 
    i = (int) (x / y); 
    Console.WriteLine("Integer outcome of x / y: " + i); 
  }    
}

Wenn Sie die Zahl auf die engere Ganzzahl runden möchten, gehen Sie wie folgt vor:

i = (int) Math.Round(x / y); // Line replaced



0

Meine Wege sind:

 - Convert.ToInt32(double_value)
 - (int)double_value
 - Int32.Parse(double_value.ToString());

11
Denken Sie nicht, dass der dritte Weg unnötig komplex und langsam ist?
Armen Tsirunyan

6
Der dritte funktioniert nicht mit Doppel mit Bruchteilen. zBdouble_value = 0.1
Jeff Mercado

Ich denke du kannst Math.Floor benutzen.
Lindexi

0
label8.Text = "" + years.ToString("00") + " years";

Wenn Sie es an ein Etikett oder etwas anderes senden möchten und keine Teilkomponente möchten, ist dies der beste Weg

label8.Text = "" + years.ToString("00.00") + " years";

wenn du mit nur 2 willst, und es ist immer so

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.