конвертировать двойной в int

156

Каков наилучший способ конвертировать doubleв int? Следует ли использовать актерский состав?

user496949
источник
7
определить «лучший». зависит от того, хотите ли вы округления вверх / вниз и т. д.
RPM1984
8
@ RPM1984: Определите etc.:)
Армен Цирунян
18
@Armen - touche` :) Неважно, в любом случае - Скит здесь, больше ничего не важно.
RPM1984

Ответы:

237

Вы можете использовать приведение, если хотите использовать поведение усечения по умолчанию до нуля. Кроме того , вы можете использовать Math.Ceiling, Math.Round, и Math.Floorт.д. , - хотя вы все еще будете нуждаться в актерском впоследствии.

Не забывайте, что диапазон intнамного меньше, чем диапазон double. Преобразование из doubleв intне вызовет исключения, если значение находится вне диапазона intв неконтролируемом контексте, тогда как вызов Convert.ToInt32(double)будет. Результат приведения (в непроверенном контексте) явно не определен, если значение находится за пределами диапазона.

Джон Скит
источник
24
@user: размер intвсегда составляет 32 бита, независимо от того, используете ли вы 32- или 64-битный компьютер.
Джорен
3
И удваивается может быть намного больше, чем даже 64-битный Int.
Адриан Ратнапала
7
Для C # noobs, как я: и Math, и Convert являются частью System. Таким образом, полный ответ выглядит так:intVal = System.Convert.ToInt32(System.Math.Floor(dblVal));
Крис
9
@ user1290746: Это бы сработало, но вы обычно располагали using System;бы верхнюю часть файла, в этот момент это могло бы быть простоintVal = Convert.ToInt32(Math.Floor(dblVal));
Джон Скит
3
@ user1290746: Но в этом случае я не думаю, что правильное решение - советовать людям использовать полностью квалифицированные имена - лучшее решение - узнать о usingдирективах.
Джон Скит
39

если вы используете приведение, то есть (int)SomeDoubleвы усекаете дробную часть. То есть, если бы SomeDoubleбыло 4.9999, результат был бы 4, а не 5. Преобразование в int не округляет число. Если вы хотите использовать округлениеMath.Round

Армен Цирунян
источник
34

Да, почему бы не?

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

Использование Convertкласса тоже хорошо работает.

int someOtherInt = Convert.ToInt32(someDouble);
Джефф Меркадо
источник
7

Convert.ToInt32 это лучший способ конвертировать

anishMarokey
источник
Это типично небезопасная функция, потому что она принимает все что угодно.
Ant_222
4

Лучший способ - просто использовать Convert.ToInt32. Это быстро, а также правильно.

Зачем делать это сложнее?

Маджид
источник
2

Вот полный пример

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

Если вы хотите округлить число до ближайшего целого, сделайте следующее:

i = (int) Math.Round(x / y); // Line replaced
Мариана Софер
источник
1

Я думаю, что лучший способ Convert.ToInt32.

одиночка
источник
0

Мои способы:

 - Convert.ToInt32(double_value)
 - (int)double_value
 - Int32.Parse(double_value.ToString());
KST
источник
11
Тебе не кажется, что третий путь слишком сложный и медленный?
Армен Цирунян
6
Третий не будет работать с двойниками с дробными частями. например,double_value = 0.1
Джефф Меркадо
Я думаю, что вы можете использовать Math.Floor.
lindexi
0
label8.Text = "" + years.ToString("00") + " years";

когда вы хотите отправить его на метку или что-то, и вам не нужен какой-либо дробный компонент, это лучший способ

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

если вы хотите только с 2, и это всегда так

Рут
источник