web-dev-qa-db-fra.com

Pourquoi Math.floor retourne 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 retourner un int?

90
Raibaz

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 le faire avec un int.

La plus grande valeur de double est également plus grande que la plus grande int, il devrait donc s'agir d'un long.

73
krosenvold

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 l'ensemble 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 n'ont que 32 bits.

Renvoyer l'entier sous forme de double est la bonne chose à faire ici car il offre une plage de nombres utile beaucoup plus large qu'un entier.

14
Nils Pipenbrinck

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 déclaration:

int a=(int) 1.5;

Cependant, (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 arrondir, et il semble bien gérer tous les cas Edge:

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

Que voudriez-vous qu'il revienne si vous lui donniez un double plus grand que le plus grand int ou long?

(Certes, si elle est plus grande que la plus longue, la précision sera de toute façon faible - ce n'est peut-être pas l'entier théorique le plus proche - mais quand même ...)

3
Jon Skeet

Tout comme il y a un entier et une division en virgule flottante en Java, il existe des façons d'entier et de virgule flottante pour faire le plancher:

double f = Math.floor(x);

ou

int k = (int) x; 

mais vous devez toujours être prudent lorsque vous utilisez un sol avec une arithmétique de précision finie: votre calcul de x peut donner quelque chose comme 1.99999999 qui sera fixé à 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 incorrects pour certaines valeurs d'entrée.

0
Pablo

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 introduisez Not a Number (NaN) dans Math.floor, il le transmettra.

S'il renvoyait un entier, il ne pourrait pas transmettre ces statuts ou erreurs, et vous pourriez obtenir de mauvais résultats à partir d'un calcul antérieur qui semblent bons mais qui sont erronés après un traitement ultérieur.

-Adam

0
Adam Davis