Réponse différente lors de la conversion d'un double en un Int - Java vs .Net
Question
En C #, si je veux convertir un double (1.71472) en un entier, alors je reçois la réponse 2. Si je le fais en Java avec la méthode intValue (), la réponse obtenue est 1.
Java réduit-il les conversions?
Pourquoi les documents de l'API Java contiennent-ils des informations aussi rares sur leurs classes, c.-à-d.
Renvoie la valeur de la spécifiée nombre en tant que int. Cela peut impliquer arrondi ou troncature.
Un peu plus d'informations sur les arrondis auraient été utiles!
La solution
Java arrondit à zéro lorsque l'on passe d'un point à virgule flottante à un type entier. Il en va de même pour C #, lorsque vous utilisez la conversion de conversion. C'est Convert.ToInt32
qui arrondit:
double d = 1.71472;
int x = (int) d; // x = 1
int y = Convert.ToInt32(d); // y = 2
Vous trouverez des détails dans la Spécification du langage Java . Notez que, si la documentation citée dans Number
laisse des options ouvertes pour les sous-classes, la documentation sur les types de boxe concrets, comme Double
, est explicite à propos de la mise en œuvre:
Renvoie la valeur de ce double sous forme de int (par transtypage à taper int).
Lors de l'utilisation de BigDecimal
, vous pouvez spécifier l’une des huit règles d’arrondi différentes.
Autres conseils
Java arrondit à zéro lors du passage d'un nombre à virgule flottante à un type entier.
Il existe davantage de documentation sur les règles générales dans le langage Java. Spécification . Notez que si la documentation dans Number
laisse des options ouvertes pour les sous-classes, la documentation sur les types de boxe concrets est plus explicite:
Renvoie la valeur de ce double sous forme de int (en transtypant taper int).
Lors de l'utilisation de BigDecimal , vous pouvez spécifier l’une des huit règles d’arrondi différentes.
Jon Skeet a raison, mais il convient de surveiller .NET utilise Arrondi bancaire comme algorithme d'arrondi. Lorsque vous êtes à mi-chemin entre le tour et le nombre entier pair.