converter duplo para int


156

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


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.


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


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


4

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

Por que torná-lo mais complicado?


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



0

Meus caminhos são:

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.