125 votes

Pourquoi Math.Floor(Double) renvoie-t-il une valeur de type Double ?

J'ai besoin d'obtenir la valeur entière de gauche à partir d'une valeur décimale ou double. Par exemple : je dois obtenir la valeur 4 à partir de 4.6. J'ai essayé d'utiliser la fonction Math.Floor mais elle renvoie une valeur double, par exemple : elle renvoie 4.0 à partir de 4.6. La documentation MSDN indique qu'elle renvoie une valeur entière. Est-ce que quelque chose m'échappe ? Ou existe-t-il un autre moyen d'obtenir ce que je cherche ?

169voto

Jon Skeet Points 692016

La gamme de double est beaucoup plus large que la gamme de int ou long . Considérez ce code :

double d = 100000000000000000000d;
long x = Math.Floor(d); // Invalid in reality

Le nombre entier est en dehors de la plage de long - Alors, que voulez-vous qu'il se passe ?

En général, vous savez que la valeur en fait être dans la fourchette de int ou long alors vous le lancez :

double d = 1000.1234d;
int x = (int) Math.Floor(d);

mais la responsabilité de cette distribution incombe au développeur, et non à Math.Floor lui-même. Il aurait été inutilement restrictif de le faire échouer avec une exception pour toutes les valeurs en dehors de l'intervalle de long .

13voto

Neil N Points 14566

Selon MSDN, Math.Floor(double) renvoie un double : http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx

Si vous voulez que ce soit un int :

int result = (int)Math.Floor(yourVariable);

Je peux voir comment l'article de MSDN peut être trompeur, ils auraient dû spécifier que même si le résultat est un "entier" (dans ce cas, cela signifie un nombre entier), il est toujours de TYPE Double.

5voto

Jon Seigel Points 8713

Si vous n'avez besoin que de la partie entière d'un nombre, mettez le nombre dans un fichier de type int . Cela tronquera le nombre à la virgule près.

double myDouble = 4.6;
int myInteger = (int)myDouble;

0voto

Jon Points 4349

C'est exact. Si l'on regarde la déclaration, Math.Floor(double) donne un double (cf. http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx ). Je suppose que par "entier", ils entendent "nombre entier".

-1voto

plinth Points 26817

Floor le laisse sous forme de double pour que vous puissiez effectuer d'autres calculs doubles avec lui. Si vous le voulez sous forme de nombre entier, transformez le résultat de floor en nombre entier. Ne transformez pas le double original en int car les règles de floor sont différentes (IIRC) pour les nombres négatifs.

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