konvertiere double in int

156

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

user496949
quelle
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.

Jon Skeet
quelle
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

Armen Tsirunyan
quelle
34

Ja, warum nicht?

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

Die Verwendung der ConvertKlasse funktioniert auch gut.

int someOtherInt = Convert.ToInt32(someDouble);
Jeff Mercado
quelle
7

Convert.ToInt32 ist der beste Weg, um zu konvertieren

anishMarokey
quelle
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?

majed
quelle
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
Mariana weicher
quelle
1

Ich denke der beste Weg ist Convert.ToInt32.

Singleton
quelle
1

int myInt = (int) Math.Ceiling (myDouble);

Mathewsun
quelle
0

Meine Wege sind:

 - Convert.ToInt32(double_value)
 - (int)double_value
 - Int32.Parse(double_value.ToString());
kst
quelle
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

Ruth
quelle