web-dev-qa-db-fra.com

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

Je dois obtenir la valeur entière du côté gauche d'un nombre décimal ou double. Pour Ex: je dois obtenir la valeur 4 à partir de 4.6. J'ai essayé d'utiliser la fonction Math.Floor, mais il renvoie une valeur double, par exemple: il renvoie 4.0 à partir de 4.6 La documentation MSDN indique qu'elle renvoie une valeur entière. Est-ce que j'ai râté quelque chose? Ou y a-t-il une manière différente de réaliser ce que je cherche?

94
Sridhar

La plage de double est beaucoup plus large que celle de int ou long. Considérons ce code:

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

Le nombre entier est en dehors de la plage de long - qu'attendez-vous donc?

En règle générale, vous savez que la valeur en fait sera dans la plage de int ou long, de sorte que vous la lancez:

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

mais la responsabilité de cette distribution incombe au développeur, pas au Math.Floor lui-même. Il aurait été inutilement restrictif de le faire échouer avec une exception pour toutes les valeurs hors de la plage long.

129
Jon Skeet

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

Si vous le voulez comme 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, il s'agit d'un nombre entier), il est toujours de TYPE Double.

11
Neil N

Si vous avez juste besoin de la partie entière d'un nombre, transformez-le en une variable int. Cela tronquera le nombre à la virgule décimale.

double myDouble = 4.6;
int myInteger = (int)myDouble;
4
Jon Seigel
Convert.ToInt32(Math.Floor(Convert.ToDouble(value)))

Cela vous donnera la valeur exacte que vous voulez si vous prenez 4.6, il renvoie 4 en sortie.

0
user3306645

C'est correct. En regardant la déclaration, Math.Floor (double) donne un double (voir http://msdn.Microsoft.com/en-us/library/e0b5f0xb.aspx ). Je suppose que par "entier", ils signifient "nombre entier".

0
Jon Onstott

Floor le laisse comme un double afin que vous puissiez faire plus de doubles calculs avec elle . Si vous le voulez comme un entier, convertissez le résultat de floor comme un entier . les règles de parole sont différentes (IIRC) pour les nombres négatifs.

0
plinth