2010-11-15 15 views
104

Was ist der beste Weg, um eine double in eine int zu konvertieren? Soll eine Besetzung verwendet werden?konvertieren double to int

+6

definieren "am besten". hängt davon ab, ob du auf/abrunden möchtest, usw. – RPM1984

+7

@ RPM1984: Definiere 'etc' :) –

+14

@Armen - touche' :) Ist eigentlich egal - Skeet ist hier, nichts anderes zählt. – RPM1984

Antwort

179

Sie können eine Umwandlung verwenden, wenn Sie das standardmäßige truncate-to-zero-Verhalten verwenden möchten. Alternativ können Sie auch Math.Ceiling, Math.Round, Math.Floor usw. verwenden - obwohl Sie danach noch eine Besetzung benötigen.

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

+0

Ich frage mich, ob Convert.ToInt32 in 64-Bit-Maschine nicht mehr OK ist? – user496949

+20

@user: Die Größe eines 'int' ist immer 32 Bit, unabhängig davon, ob Sie eine 32 oder 64 Bit Maschine verwenden. – Joren

+2

Und doubles kann viel größer sein als sogar ein 64-Bit-Int. –

23

Ja, warum nicht?

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

Die Klasse Convert funktioniert auch gut.

int someOtherInt = Convert.ToInt32(someDouble); 
6

Convert.ToInt32 ist der beste Weg

+0

Dies ist eine in der Regel unsichere Funktion, weil es einfach alles akzeptiert. –

34

zu konvertieren, wenn Sie Guss verwenden, das heißt, (int)SomeDouble Sie den Bruchteil abgeschnitten wird. Das heißt, wenn SomeDouble 4.9999 wären, wäre das Ergebnis 4, nicht 5. Die Konvertierung in int rundet die Zahl nicht. Wenn Sie verwenden möchten Math.Round

0

Meine Wege Runden sind:

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

Denkst du nicht, dass der dritte Weg unnötig komplex und langsam ist? –

+6

Der dritte funktioniert nicht mit Doppelbögen mit Nachkommastellen. z. B. 'double_value = 0.1' –

+0

Ich denke, Sie können Math.Floor verwenden. – lindexi

2

Ich denke, der beste Weg, Convert.ToInt32 ist. Hier

2

ist ein komplettes 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 Nummer auf die engere ganze Zahl gehen Sie wie folgt runden möchten:

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

Der beste Weg ist einfach zu bedienen Convert.ToInt32 . Es ist schnell und auch richtig abgerundet.

Warum es komplizierter machen?

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

, wenn Sie wollen, dass es zu einem Etikett schicken, oder etwas, und Sie keine Bruchkomponente wollen, ist dies der beste Weg,

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

, wenn Sie mit nur 2 mögen, und es ist immer so

0

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