Comment convertir un double en int le plus proche?
147
Utiliser Math.round()
, éventuellement en conjonction avecMidpointRounding.AwayFromZero
par exemple:
Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3
Convert.ToInt32()
fera- t-il pas la même chose ou supprimera-t-il simplement tout après la virgule?Référence
Gère les arrondis comme ceci:
la source
Math.Round
car il renvoie un int comme requis.[0,.5)
- vers le bas et exactement la moitié des nombres -[.5,1)
- vers le haut. Arrondir à même légèrement biaiser les nombres pairs, car il arrondit(.5,1.5)
à 1 mais[1.5,2.5]
à 2.Vous pouvez également utiliser la fonction:
Selon l'architecture, c'est plusieurs fois plus rapide.
la source
la source
Je sais que cette question est ancienne, mais je l'ai rencontrée en cherchant la réponse à ma question similaire. J'ai pensé partager le conseil très utile qui m'a été donné.
Lors de la conversion en int, ajoutez simplement
.5
à votre valeur avant le downcasting. Comme le downcastingint
tombe toujours au nombre inférieur (par exemple(int)1.7 == 1
), si votre nombre est.5
ou supérieur, l'ajout.5
le ramènera au nombre suivant et votre downcastint
devrait renvoyer la valeur correcte. (par exemple(int)(1.8 + .5) == 2
)la source
+ 0.5 * Math.Abs(d)
Les méthodes d'autres réponses lancent
OverflowException
si la valeur flottante est en dehors de la plage Int. https://docs.microsoft.com/en-us/dotnet/api/system.convert.toint32?view=netframework-4.8#System_Convert_ToInt32_System_Single_la source
Pour Unity, utilisez Mathf.RoundToInt .
La source
la source
Je développe une calculatrice scientifique qui arbore un bouton Int. J'ai trouvé ce qui suit est une solution simple et fiable:
Math.Round produit parfois des résultats inattendus ou indésirables, et la conversion explicite en entier (via cast ou Convert.ToInt ...) produit souvent des valeurs erronées pour les nombres de plus haute précision. La méthode ci-dessus semble toujours fonctionner.
la source