2010-11-15 18 views
104

Jaki jest najlepszy sposób przekonwertowania double na int? Czy należy użyć odlewu?konwersja podwójna na int

+6

zdefiniować "najlepiej". zależy, czy chcesz zaokrąglić w górę/w dół, itp. – RPM1984

+7

@ RPM1984: Zdefiniuj 'etc.' :) –

+14

@Armen - touche' :) Tak naprawdę to nie ma znaczenia - Skeet jest tutaj, nic się nie liczy. – RPM1984

Odpowiedz

179

Możesz użyć rzutowania, jeśli chcesz zachować domyślne zachowanie skrócone do zera. Alternatywnie możesz użyć Math.Ceiling, Math.Round, Math.Floor itd. - jednak nadal będziesz potrzebować rzutowania.

Nie zapominaj, że zakres int jest znacznie mniejszy niż zakres double. Odlewanie z double do int nie spowoduje wyjątku, jeśli wartość jest poza zakresem int w niezaznaczonym kontekście, podczas gdy wywołanie Convert.ToInt32(double) spowoduje. Wynik rzutowania (w niezaznaczonym kontekście) jest jawnie niezdefiniowany, jeśli wartość jest poza zakresem.

+0

Zastanawiam się, czy w maszynie 64-bitowej Convert.ToInt32 nie jest już OK? – user496949

+20

@user: Rozmiar 'int' jest zawsze 32-bitowy, niezależnie od tego, czy używasz maszyny 32- czy 64-bitowej. – Joren

+2

A podwójne mogą być znacznie większe niż 64-bitowe int. –

23

Tak, dlaczego nie?

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

Praca z klasą Convert działa również.

int someOtherInt = Convert.ToInt32(someDouble); 
6

Convert.ToInt32 jest najlepszym sposobem konwersji

+0

Jest to typowo niebezpieczna funkcja, ponieważ akceptuje wszystko. –

34

jeśli używasz obsady, czyli (int)SomeDouble można obciąć część ułamkową. Oznacza to, że jeśli SomeDouble były 4,9999, wynik byłby 4, a nie 5. Konwersja do int nie zaokrągla liczby. Jeśli chcesz zaokrąglenia Użyj Math.Round

0

Moje sposoby to:

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

Nie sądzisz, że trzeci sposób jest niepotrzebnie skomplikowany i wolny? –

+6

Trzeci nie będzie działał z podwójnymi częściami ułamkowymi. np. 'double_value = 0.1' –

+0

Myślę, że możesz użyć Math.Floor. – lindexi

2

Myślę, że najlepszym sposobem jest Convert.ToInt32.

2

Powyżej znajduje się pełna przykład

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

Jeśli chcesz zaokrąglić liczbę do bliższej całkowitej wykonaj następujące czynności:

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

Najlepszym sposobem jest po prostu użyć Convert.ToInt32 . Jest szybki i runduje poprawnie.

Dlaczego to bardziej skomplikowane?

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

kiedy chcesz wysłać go na etykiecie, czy coś, a ty nie chcesz żadnego komponentu ułamkową, to jest najlepszy sposób

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

jeśli chcesz tylko 2, a zawsze jest tak, że