[.NET] Conversion single/int

Coucou les gens.
Voilà voilà un drôle de comportement que je viens d’avoir alors que je jouais avec .NET

Un petit textbox où je mets une valeur compris entre 0 et 0,20.
Je me dis, tiens on va vérifier que je mets bien 2 chiffres après la virgule et pas 3.
Alors pour tester d’une manière différente, je me dit que je vais multiplier la vlauer par 100 et comparer avec une variable entière.

J’ai donc :

Dim slMarge As Single slMarge = Convert.ToSingle(txtMarge.Text) Dim checkMarge As Single = slMarge * 100 If checkMarge <> Convert.ToInt32(checkMarge) Then 'bah non... End If
Je mets donc 0, 0.1, 0.10, 0.20, 0.14, …

Alors c’est marrant mais ça fonctionne… presque.

En fait ce qui me surprend c’est qu’il n’y a qu’une seule valeur qui plante, c’est “0.15”.
Et je trouve ça ennuyeux.
En fait dans checkMarge je me retrouve avec 15.0000001

J’hésite à poser la bonne question entre :

  • Pourquoi j’ai un 000001 qui apparait
  • Pourquoi seul 0.15 semble amener ce comportement

J’avoue que je suis pas mal curieux d’y comprendre quelque chose…

Ptete un lien avec le sujet là.

C’est un problème classique, dans ton cas, si tu es sur qu’il ne peut y avoir que deux chiffres après la virgule maximum, une fois que tu as mutiplié par 100, au lieu de convertir en Integer, essaye de ne récupérer que la partie entière (il doit bien y avoir une fonction qui fait ça). C’est comme ça que je rêgle mes problèmes d’arrondis lorsque je connais le nombre de décimales maximum.

Tu peux aussi utiliser Math.Round ou un truc comme ca qui prend le nombre de decimales que tu veux pour l’arrondi…

Nononon, je me suis fait mal comprendre.

En fait je cherchais d’autre solution pour imposer 2 chiffres après la virgule.
Donc je voulais entrer dans mon If lorsque je mettais, par exemple 0.123, ou 0.025.
Donc si j’arrondi, j’aurais toujours bon.
Juste pour rappel, dans ma variable slMarge j’ai bien la valeur 0.15.

Je voudrais quand même comprendre pourquoi j’arrive à avoir un étrange numéro que pour cette valeur, et pas 0.14, ou 0.16, ou 0.10, …

Edit : je lis le pdf que glop a mis dans le lien fournit par bishop et je serais moins con à poser des questions.

Parceque sinon :stuck_out_tongue:
Console.WriteLine(Math.Round(0.1512, 2)); —> 0.15
Console.WriteLine(Math.Round(0.1552, 2)); —> 0.16

Sinon pour le pourquoi de ton truc c’est dans le PDF :stuck_out_tongue: