39 votes

Pourquoi Math.Round ne renvoie pas un int ?

En C#, pourquoi les fonctions mathématiques d'arrondi Floor, Ceiling et Round ne retournent-elles pas une valeur de int ? Sachant que le résultat de la fonction sera toujours un entier, pourquoi renvoie-t-elle un float , double o decimal ?

36voto

Alvin Wong Points 5803

double a une portée de ±5.0 × 10 -324 à ±1,7 × 10 308 y long est compris entre -9,223,372,036,854,775,808 et 9,223,372,036,854,775,807. . Malheureusement pas todo Les valeurs intégrales à virgule flottante peuvent être représentées par un nombre entier.

Par exemple, 1e19 a déjà dépassé la plage d'un entier signé de 64 bits.

(long)Math.Round(1e19) == -9223372036854775808L // WTF?

S'il est vrai que les surcharges à argument unique Math.Round(double) y Math.Round(decimal) retournera toujours une valeur entière, ces surcharges ne peuvent toujours pas retourner un type de valeur entière.

Si vous connaître que la valeur passée à la fonction renverra une valeur représentable par un type de valeur entière, vous pouvez la couler vous-même. La bibliothèque ne le fera pas car elle doit prendre en compte le cas général.

13voto

Habib Points 93087

Considérant que le résultat de la fonction sera toujours un nombre entier,

Non, ce ne sera pas le cas. Vous pouvez même spécifier le nombre de chiffres avec Méthode Math.Round (Double, Int32)

Type de digits :
System.Int32
Le nombre de chiffres fractionnaires dans la valeur de retour.

2voto

Igoy Points 933

Cela permet d'inclure des nombres plus grands que ceux qui sont inclus dans l'intervalle d'un int. Ainsi, Math.Floor renverra un double qui pourra être casté en int ou long en fonction de la taille et du développeur. Si vous avez essayé Math.Floor en dehors de l'intervalle int, vous auriez échoué si Math.Floor avait retourné un int, mais ce n'est pas le cas, il retourne un double que vous pouvez convertir en long.

     double d = 4147483647.5678;
     long a = (long)Math.Floor(d);
     int b = (int)Math.Floor(d);
     Console.WriteLine(a);
     Console.WriteLine(b);

Notez que lors du casting vers int, b a été repoussé vers MIN int, puisque int ne peut pas l'accueillir.

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