convertir double en int

156

Quelle est la meilleure façon de convertir un doubleen un int? Doit-on utiliser un plâtre?

user496949
la source
7
définir «meilleur». dépend si vous voulez arrondir vers le haut / bas, etc.
RPM1984
8
@ RPM1984: Define etc.:)
Armen Tsirunyan
18
@Armen - touche` :) Peu importe de toute façon - Skeet est là, rien d'autre n'a d'importance.
RPM1984

Réponses:

237

Vous pouvez utiliser un cast si vous voulez le comportement par défaut de tronquer vers zéro. Alternativement, vous pouvez utiliser Math.Ceiling, Math.Round, Math.Flooretc - mais vous aurez toujours besoin d' un plâtre après.

N'oubliez pas que la plage de intest beaucoup plus petite que celle de double. Un cast de doublevers intne lèvera pas d'exception si la valeur est en dehors de la plage de intdans un contexte non vérifié, alors qu'un appel à Convert.ToInt32(double)will. Le résultat de la conversion (dans un contexte non vérifié) est explicitement indéfini si la valeur est en dehors de la plage.

Jon Skeet
la source
24
@user: La taille d'un intest toujours de 32 bits, que vous utilisiez une machine 32 ou 64 bits.
Joren
3
Et les doubles peuvent être beaucoup plus lourds que même un int 64 bits.
Adrian Ratnapala
7
Pour C # noobs comme moi: Math et Convert font tous deux partie de System. Donc la réponse complète ressemble à ceci:intVal = System.Convert.ToInt32(System.Math.Floor(dblVal));
kris
9
@ user1290746: Cela fonctionnerait, mais vous avez généralement juste using System;en haut du fichier, à quel point cela pourrait simplement êtreintVal = Convert.ToInt32(Math.Floor(dblVal));
Jon Skeet
3
@ user1290746: Mais dans ce cas, je ne pense pas que la bonne solution soit de conseiller aux gens d'utiliser les noms complets - la meilleure solution est de se renseigner sur les usingdirectives.
Jon Skeet
39

si vous utilisez cast, c'est-à-dire que (int)SomeDoublevous tronquerez la partie fractionnaire. Autrement dit, si SomeDouble4,9999 était égal à 4,9999, le résultat serait 4 et non 5. La conversion en int n'arrondit pas le nombre. Si vous souhaitez arrondir, utilisezMath.Round

Armen Tsirunyan
la source
34

Ouais pourquoi pas?

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

Utiliser la Convertclasse fonctionne bien aussi.

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

Convert.ToInt32 est le meilleur moyen de convertir

anishMarokey
la source
C'est une fonction généralement dangereuse car elle accepte n'importe quoi.
Ant_222
4

Le meilleur moyen est d'utiliser simplement Convert.ToInt32. Il est rapide et s'arrondit correctement.

Pourquoi compliquer les choses?

majed
la source
2

Voici un exemple complet

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

Si vous souhaitez arrondir le nombre à l'entier le plus proche, procédez comme suit:

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

Je pense que le meilleur moyen est Convert.ToInt32.

Singleton
la source
1

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

mathewsun
la source
0

Mes manières sont:

 - Convert.ToInt32(double_value)
 - (int)double_value
 - Int32.Parse(double_value.ToString());
kst
la source
11
Ne pensez-vous pas que la troisième voie est inutilement complexe et lente?
Armen Tsirunyan
6
Le troisième ne fonctionnera pas avec des doubles avec des parties fractionnaires. par exemple,double_value = 0.1
Jeff Mercado
Je pense que vous pouvez utiliser Math.Floor.
lindexi
0
label8.Text = "" + years.ToString("00") + " years";

lorsque vous voulez l'envoyer à une étiquette, ou quelque chose, et que vous ne voulez pas de composant fractionnaire, c'est la meilleure façon

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

si tu veux avec seulement 2, et c'est toujours comme ça

Ruth
la source