converti doppio in int


156

Qual è il modo migliore per convertire un doublein un int? Dovrebbe essere usato un cast?


7
definire "migliore". dipende se si desidera arrotondamento su / giù, ecc.
RPM1984

8
@ RPM1984: Definisci etc.:)
Armen Tsirunyan,

18
@Armen - touche` :) Non importa davvero comunque - Skeet è qui, nient'altro importa.
RPM1984,

Risposte:


237

È possibile utilizzare un cast se si desidera il comportamento troncato verso zero predefinito. In alternativa, si potrebbe desiderare di utilizzare Math.Ceiling, Math.Round, Math.Floorecc - anche se avrai ancora bisogno di un cast in seguito.

Non dimenticare che l'intervallo di intè molto più piccolo dell'intervallo di double. Un cast da doublea intnon genererà un'eccezione se il valore è al di fuori dell'intervallo di intin un contesto non controllato, mentre una chiamata a Convert.ToInt32(double)will. Il risultato del cast (in un contesto non controllato) è esplicitamente indefinito se il valore è al di fuori dell'intervallo.


24
@utente: la dimensione di an intè sempre di 32 bit, indipendentemente dal fatto che si stia utilizzando una macchina a 32 o 64 bit.
Joren,

3
E i doppi possono essere molto più grandi di persino un int a 64 bit.
Adrian Ratnapala,

7
Per i rumori di C # come me: sia Math che Convert fanno parte del Sistema. Quindi la risposta completa è simile alla seguente:intVal = System.Convert.ToInt32(System.Math.Floor(dblVal));
kris,

9
@ user1290746: Funzionerebbe, ma di solito avresti solo using System;in cima al file, a quel punto potrebbe essereintVal = Convert.ToInt32(Math.Floor(dblVal));
Jon Skeet

3
@ user1290746: Ma in quel caso, non credo che la soluzione giusta sia quella di consigliare alle persone di usare i nomi completi: la soluzione migliore è quella di conoscere le usingdirettive.
Jon Skeet,

39

se usi il cast, cioè, (int)SomeDoubletroncerai la parte frazionaria. Cioè, se SomeDoublefossero 4.9999 il risultato sarebbe 4, non 5. La conversione in int non arrotonda il numero. Se vuoi arrotondare usaMath.Round


34

Sì, perché no?

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

Anche l'uso della Convertclasse funziona bene.

int someOtherInt = Convert.ToInt32(someDouble);

7

Convert.ToInt32 è il modo migliore per convertire


Questa è una funzione generalmente non sicura perché accetta qualsiasi cosa.
Ant_222,

4

Il modo migliore è semplicemente usare Convert.ToInt32. È veloce e anche arrotondato correttamente.

Perché renderlo più complicato?


2

Ecco un esempio completo

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

Se si desidera arrotondare il numero al numero intero più vicino, procedere come segue:

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



0

I miei modi sono:

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

11
Non pensi che la terza via sia inutilmente complessa e lenta?
Armen Tsirunyan,

6
Il terzo non funzionerà con i doppi con le parti frazionarie. ad esempio,double_value = 0.1
Jeff Mercado

Penso che tu possa usare Math.Floor.
Lindexi,

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

quando si desidera inviarlo a un'etichetta o qualcosa del genere e non si desidera alcun componente frazionario, questo è il modo migliore

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

se vuoi solo con 2, ed è sempre così

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.