Question

Quelqu'un peut-il expliquer pourquoi int (0.4 * 10.0) est 4 et pourtant int ((2.4 - 2.0) * 10.0) est < code> 3 ?

Et ensuite, expliquez également comment obtenir 4 . Dois-je vraiment faire int (System.Math.Round ((2.4 - 2.0) * 10.0)) ?

C'est tellement moche pour quelque chose qui devrait être si simple.

Était-ce utile?

La solution

La double représentation de 2.4 - 2.0 est 0.399999999999. Lorsque vous convertissez un nombre en entier, la partie décimale est tronquée de sorte que 3.999999999 soit tronqué à 3.

Autres conseils

  

Et puis s'il vous plaît également expliquer comment obtenir 4. c'est-à-dire, dois-je vraiment faire

     

int (System.Math.Round ((2.4 - 2.0) * 10.0))

     

c'est tellement moche pour quelque chose qui devrait être si simple.

Bien sûr que non, définissez simplement

let round x = int System.Math.Round(x)

En fait, dans .Net, il existe un type de données decimal qui vous aidera à résoudre ce problème, si vos nombres peuvent être représentés exactement sous forme de fractions décimales.

2.4m - 2.0m == 0.4m
2.4 - 2.0   != 0.4

Pour convertir un nombre float en un int , utilisez:

let i = Convert.ToInt32 (f)

Les nombres en virgule flottante ne sont pas une précision infinie. Certains nombres peuvent être représentés parfaitement (tout ce qui implique des puissances de deux, par exemple 1, 1/2 = 0,5, 1/4 = 0,25, etc.), d'autres ne peuvent pas (par exemple 1/3 ne peut pas être décomposé exactement en une séquence finie des pouvoirs de deux). Couper la fin de la série infinie entraîne souvent que la version codée d’un nombre soit légèrement inférieure à sa valeur réelle.

Combinez cela avec le fait que l'opérateur (int) tronque plutôt que d'arrondir, et vous pouvez être confronté au cas où une opération qui devrait donner 4.0 donne lieu à 3.999999999991 à la place de 3.

Chaque fois que vous essayez de convertir des nombres flottants / doubles en nombres entiers, vous voulez bien réfléchir à l'opérateur que vous voulez utiliser: tronquer (arrondi au bas), arrondir au plus haut ou arrondir au plus proche.

Comme il s'agit d'un problème avec les représentations à virgule flottante, cela s'applique non seulement à F #, mais également à C # et à Java (IIRC) et à d'autres langages.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top