zamień podwójne na int

156

Jaki jest najlepszy sposób konwersji a doublena int? Czy należy użyć odlewu?

user496949
źródło
7
zdefiniować „najlepsze”. zależy od tego, czy chcesz zaokrąglać w górę / w dół, itp.
RPM1984
8
@ RPM1984: Definiuj etc.:)
Armen Tsirunyan
18
@Armen - touche` :) Tak naprawdę to nie ma znaczenia - Skeet jest tutaj, nic innego się nie liczy.
RPM1984

Odpowiedzi:

237

Możesz użyć rzutowania, jeśli chcesz zachować domyślne zachowanie obcinania w kierunku zera. Alternatywnie, możesz użyć Math.Ceiling, Math.Round, Math.Flooretc - choć nadal będziesz potrzebować obsady później.

Nie zapominaj, że zakres intjest znacznie mniejszy niż zakres double. Rzutowanie z doubledo intnie zgłosi wyjątku, jeśli wartość jest poza zakresem intw niesprawdzonym kontekście, podczas gdy wywołanie Convert.ToInt32(double)will. Wynik rzutowania (w niesprawdzonym kontekście) jest jawnie niezdefiniowany, jeśli wartość jest poza zakresem.

Jon Skeet
źródło
24
@user: rozmiar an intwynosi zawsze 32 bity, niezależnie od tego, czy używasz maszyny 32-bitowej, czy 64-bitowej.
Joren
3
A podwójne mogą być znacznie większe niż nawet 64-bitowe int.
Adrian Ratnapala
7
Dla noobów C # takich jak ja: zarówno Math, jak i Convert są częścią System. Tak więc pełna odpowiedź wygląda następująco:intVal = System.Convert.ToInt32(System.Math.Floor(dblVal));
kris
9
@ user1290746: To by zadziałało, ale zwykle byłbyś po prostu using System;na początku pliku, w którym to momencie może to byćintVal = Convert.ToInt32(Math.Floor(dblVal));
Jon Skeet
3
@ user1290746: Ale w tym przypadku nie sądzę, aby dobrym rozwiązaniem było doradzanie ludziom używania w pełni kwalifikowanych nazw - lepszym rozwiązaniem jest poznanie usingdyrektyw.
Jon Skeet
39

jeśli używasz rzutowania, to znaczy, (int)SomeDoubleże obcinasz część ułamkową. To znaczy, gdyby SomeDoublebyło 4,9999, wynikiem byłoby 4, a nie 5. Konwersja na wartość int nie zaokrągla liczby. Jeśli chcesz zaokrąglić, użyjMath.Round

Armen Tsirunyan
źródło
34

Tak czemu nie?

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

Korzystanie z Convertklasy również działa dobrze.

int someOtherInt = Convert.ToInt32(someDouble);
Jeff Mercado
źródło
7

Convert.ToInt32 to najlepszy sposób na konwersję

anishMarokey
źródło
Jest to typowo niebezpieczna funkcja, ponieważ akceptuje wszystko.
Ant_222,
4

Najlepszym sposobem jest po prostu użycie Convert.ToInt32. Jest szybki i dobrze zaokrągla.

Po co to komplikować?

majed
źródło
2

Oto pełny 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 najbliższej liczby całkowitej, wykonaj następujące czynności:

i = (int) Math.Round(x / y); // Line replaced
mariana soffer
źródło
1

Myślę, że najlepszy sposób to Convert.ToInt32.

Singel
źródło
1

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

mathewsun
źródło
0

Moje sposoby to:

 - Convert.ToInt32(double_value)
 - (int)double_value
 - Int32.Parse(double_value.ToString());
kst
źródło
11
Czy nie uważasz, że trzecia droga jest niepotrzebnie skomplikowana i powolna?
Armen Tsirunyan
6
Trzeci nie będzie działał z podwójnymi z częściami ułamkowymi. np.double_value = 0.1
Jeff Mercado
Myślę, że możesz użyć Math.Floor.
lindexi
0
label8.Text = "" + years.ToString("00") + " years";

jeśli chcesz wysłać to na etykietę lub coś w tym stylu, a nie chcesz żadnego ułamkowego składnika, to jest najlepszy sposób

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

jeśli chcesz tylko z 2, i zawsze tak jest

Litość
źródło