converter duplo para int

156

Qual é a melhor maneira de converter um doublepara um int? Um elenco deve ser usado?

user496949
fonte
7
defina "melhor". depende se você deseja arredondar para cima / baixo, etc.
RPM1984
8
@ RPM1984: Define etc.:)
Armen Tsirunyan
18
@ Armmen - touche` :) Realmente não importa de qualquer maneira - Skeet está aqui, nada mais importa.
RPM1984

Respostas:

237

Você pode usar uma conversão se desejar o comportamento padrão de truncar para zero. Alternativamente, você pode querer usar Math.Ceiling, Math.Round, Math.Flooretc - embora você ainda vai precisar de um elenco depois.

Não esqueça que o alcance de inté muito menor que o alcance de double. Uma conversão de doublepara intnão lançará uma exceção se o valor estiver fora do intervalo intem um contexto não verificado, enquanto uma chamada para a Convert.ToInt32(double)vontade. O resultado da conversão (em um contexto não verificado) é explicitamente indefinido se o valor estiver fora do intervalo.

Jon Skeet
fonte
24
@ usuário: o tamanho de um inté sempre 32 bits, independentemente de você estar usando uma máquina de 32 ou 64 bits.
Joren
3
E duplos podem ser muito mais fortes do que um int de 64 bits.
Adrian Ratnapala
7
Para noobs em C # como eu: Math e Convert fazem parte do System. Então os olhares resposta completa como este:intVal = System.Convert.ToInt32(System.Math.Floor(dblVal));
kris
9
@ user1290746: Isso iria funcionar, mas você normalmente só tem using System;no topo do arquivo, em que ponto ele poderia ser apenasintVal = Convert.ToInt32(Math.Floor(dblVal));
Jon Skeet
3
@ user1290746: Mas, nesse caso, não acho que a solução certa seja aconselhar as pessoas a usarem os nomes totalmente qualificados - a melhor solução é aprender sobre usingdiretrizes.
Jon Skeet
39

se você usar elenco, ou seja, (int)SomeDoublevocê truncará a parte fracionária. Ou seja, se SomeDoublefosse 4,9999, o resultado seria 4, e não 5. A conversão para int não arredonda o número. Se você deseja arredondar, useMath.Round

Armen Tsirunyan
fonte
34

Sim, porque não?

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

Usar a Convertclasse também funciona bem.

int someOtherInt = Convert.ToInt32(someDouble);
Jeff Mercado
fonte
7

Convert.ToInt32 é a melhor maneira de converter

anishMarokey
fonte
Essa é uma função normalmente insegura porque aceita qualquer coisa.
Ant_222 05/07
4

A melhor maneira é simplesmente usar Convert.ToInt32. É rápido e também arredonda corretamente.

Por que torná-lo mais complicado?

amaldiçoado
fonte
2

Aqui está um exemplo 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 você deseja arredondar o número para o número inteiro mais próximo, faça o seguinte:

i = (int) Math.Round(x / y); // Line replaced
mariana soffer
fonte
1

Eu acho que o melhor caminho é Convert.ToInt32.

Singleton
fonte
1

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

mathewsun
fonte
0

Meus caminhos são:

 - Convert.ToInt32(double_value)
 - (int)double_value
 - Int32.Parse(double_value.ToString());
kst
fonte
11
Você não acha que a terceira via é desnecessariamente complexa e lenta?
Armen Tsirunyan
6
O terceiro não funcionará com dobras com partes fracionárias. por exemplo,double_value = 0.1
Jeff Mercado
Eu acho que você pode usar Math.Floor.
Lindexi
0
label8.Text = "" + years.ToString("00") + " years";

quando você deseja enviá-lo para uma etiqueta, ou algo assim, e você não deseja nenhum componente fracionário, esta é a melhor maneira

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

se você quiser com apenas 2, e é sempre assim

Ruth
fonte