Pourquoi Math.floor retourne-t-il un double?

Javadoc officiel dit que Math.floor renvoie un double qui est “égal à un entier mathématique”, mais alors pourquoi ne devrait-il pas renvoyer un int?

Selon le même javadoc:

Si l’argument est NaN ou un infini ou un zéro positif ou un zéro négatif, le résultat est le même que l’argument. Impossible de faire ça avec un int.

La plus grande valeur double est également plus grande que le plus grand int, il devrait donc être long.

C’est pour la précision. Le type de données double a une mantisse de 53 bits. Entre autres choses, cela signifie qu’un double peut représenter la totalité jusqu’à 2 ^ 53 sans perte de précision.

Si vous stockez un si grand nombre dans un entier, vous obtiendrez un débordement. Les entiers ne comportent que 32 bits.

Renvoyer le nombre entier sous la forme d’un double est la bonne chose à faire ici, car il offre une plage de nombres utile beaucoup plus grande qu’un nombre entier pourrait l’être.

D’autres vous ont dit pourquoi, je vais vous dire comment arrondir correctement étant donné que vous voulez le faire. Si vous n’utilisez que des nombres positifs, vous pouvez utiliser cette instruction:

int a=(int) 1.5; 

Cependant, le (int) arrondit toujours vers 0. Ainsi, si vous voulez faire un nombre négatif:

 int a=(int) -1.5; //Equal to -1 

Dans mon cas, je ne voulais pas faire ça. J’ai utilisé le code suivant pour faire l’arrondi et il semble bien gérer tous les cas extrêmes:

 private static long floor(double a) { return (int) Math.floor(a); } 

Que voudriez-vous qu’il revienne si vous lui avez donné un double plus grand que le plus grand int ou long?

(Certes, si la longueur est plus grande que la plus longue, la précision sera de toute façon faible – ce ne sera peut-être pas le nombre entier théorique le plus proche – mais même si …)

Cette erreur et les autres valeurs non entières peuvent donc se répercuter correctement dans une série de calculs.

Par exemple, si vous transmettez Pas un numéro (NaN) dans Math.floor, il le transmettra.

Si elle renvoyait un nombre entier, elle ne pouvait pas transmettre ce statut ou ces erreurs, et vous pouviez obtenir de mauvais résultats lors d’un calcul antérieur, mais qui semblaient faux après un traitement ultérieur.

-Adam

Tout comme il existe un nombre entier et une division en virgule flottante en Java, il existe des méthodes entières et à virgule flottante pour effectuer le floor:

 double f = Math.floor(x); 

ou

 int k = (int) x; 

mais vous devez toujours faire attention lorsque vous utilisez l’arithmétique de précision finie: votre calcul de x peut donner quelque chose comme 1.99999999 qui sera mis à 1 et non 2 par les deux formes. De nombreux algorithmes doivent contourner cette limitation pour éviter de produire des résultats incorrects pour certaines valeurs d’entrée.