Javadoc officiel dit que Math.floor()
renvoie a double
qui est "égal à un entier mathématique", mais alors pourquoi ne devrait-il pas renvoyer un int
?
104
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. Je ne peux pas faire ça avec un int
.
La double
valeur la plus élevée est également plus grande que la plus grande int
, il faudrait donc qu'elle soit a long
.
C'est pour la précision. Le type de données double a une mantisse de 53 bits. Cela signifie entre autres qu'un double peut représenter tout entier jusqu'à 2 ^ 53 sans perte de précision.
Si vous stockez un nombre aussi grand dans un entier, vous obtiendrez un débordement. Les nombres entiers n'ont que 32 bits.
Renvoyer l'entier sous la forme d'un double est la bonne chose à faire ici car il offre une plage de nombres utile beaucoup plus large qu'un entier.
la source
D'autres vous ont dit pourquoi, je vais vous dire comment arrondir correctement si vous voulez le faire. Si vous n'utilisez que des nombres positifs, vous pouvez utiliser cette instruction:
Cependant, le (int) arrondit toujours vers 0. Ainsi, si vous voulez faire un nombre négatif:
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 de bord:
la source
(int) Math.floor(a)
? C'est probablement plus efficace et plus court.(int) Math.floor(a)
vous pouvez simplement écrire(int) a
, si a est positif.Que voudriez-vous qu'il renvoie si vous lui donniez un double plus grand que le plus grand int ou long?
(Certes, s'il est plus grand que le plus grand long, la précision sera de toute façon faible - ce n'est peut-être pas l'entier théorique le plus proche - mais même ainsi ...)
la source
Tout comme il y a un entier et une division en virgule flottante en Java, il existe des façons entières et en virgule flottante de faire le plancher:
ou
mais vous devez toujours faire attention à l'utilisation de floor avec une arithmétique de précision finie: votre calcul de x peut donner quelque chose comme 1.99999999 qui sera réduit à 1, et non à 2 par les deux formes. Il existe de nombreux algorithmes qui doivent contourner cette limitation pour éviter de produire des résultats erronés pour certaines valeurs d'entrée.
la source
Ainsi, cette erreur et d'autres valeurs non entières peuvent correctement se répercuter sur une série de calculs.
Par exemple, si vous insérez Not a Number (NaN) dans Math.floor, il le transmettra.
S'il retournait un entier, il ne pouvait pas transmettre ces statuts ou erreurs, et vous pourriez obtenir de mauvais résultats d'un calcul antérieur qui semblent bons mais sont erronés après un traitement ultérieur.
la source