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
?
Réponses
Trop de publicités?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.
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.
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.