121 votes

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

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

88voto

krosenvold Points 35979

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 identique à l'argument. Je ne peux pas faire ça avec un int.

La plus grande valeur double est également plus grande que la plus grande int, elle devrait donc être longue.

18voto

Nils Pipenbrinck Points 41006

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 tout entier jusqu’à 2 ^ 53 sans perte de précision.

Si vous stockez un nombre aussi important dans un entier, vous obtiendrez un débordement. Les entiers n'ont que 32 bits.

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

17voto

PearsonArtPhoto Points 14639

D'autres ont dit le pourquoi, je vais vous dire comment faire pour arrondir correctement étant donné que vous voulez faire. Si vous allez seulement utiliser des nombres positifs, alors vous pouvez utiliser cette instruction:

int a=(int) 1.5;

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

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

Dans mon cas, je n'ai pas envie de le faire. J'ai utilisé le code suivant pour faire les arrondis, et il semble gérer tous les cas de bord:

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

3voto

Jon Skeet Points 692016

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

(Certes, si c'est plus grand que le plus long long 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 ...)

0voto

Adam Davis Points 47683

Ainsi, cette erreur et d'autres valeurs non entières peuvent correctement être répercutées dans une série de calculs.

Par exemple, si vous introduisez Pas un nombre (NaN) dans Math.floor, il le transmettra.

S'il renvoie un nombre entier, il ne peut pas transmettre ces informations ni ces erreurs, et vous risquez d'obtenir des résultats erronés d'un calcul précédent. Ils semblent corrects mais erronés après un traitement supplémentaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X