zamień podwójne na int


156

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


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.


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


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


4

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

Po co to komplikować?


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



0

Moje sposoby to:

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.