web-dev-qa-db-fra.com

Pourquoi Math.ceil retourne un double?

Lorsque j'appelle Math.ceil(5.2) le retour est le double6.0. Mon inclination naturelle était de penser que Math.ceil(double a) retournerait un long. De la documentation:

ceil(double a)

Renvoie la plus petite valeur (la plus proche de l'infini négatif) double qui n'est pas inférieure à l'argument et est égale à un entier mathématique.

Mais pourquoi renvoyer un double plutôt qu'un long lorsque le résultat est un entier? Je pense que comprendre la raison de cela pourrait m'aider à comprendre Java un peu mieux. Cela pourrait également m'aider à déterminer si je vais me mettre dans le pétrin en lançant un long , par exemple est

long b = (long)Math.ceil(a);

toujours ce que je pense que ça devrait être? Je crains que certains cas limites ne posent problème.

71
PengOne

La plage de double est supérieure à celle de long. Par exemple:

double x = Long.MAX_VALUE;
x = x * 1000;
x = Math.ceil(x);

Qu'attendez-vous de la dernière ligne si Math.ceil a renvoyé long?

Notez qu'à des valeurs très grandes (positives ou négatives) les nombres finissent par être distribués très peu - donc le prochain entier supérieur à l'entier x ne sera pas x + 1 Si tu vois ce que je veux dire.

66
Jon Skeet

Un double peut être plus grand que Long.MAX_VALUE. Si vous appelez Math.ceil() sur une telle valeur, vous vous attendez à retourner la même valeur. Cependant, s'il renvoyait un long, la valeur serait incorrecte.

13
Peter Lawrey