Je pense que cela est du en interne aux valeurs binaires utilisees pour les calculs tu peut regarder du cote de " Floor " ou de " ceil "
Je pense que cela est du en interne aux valeurs binaires utilisees pour les calculs tu peut regarder du cote de " Floor " ou de " ceil "
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
J'ai pas mal travaillé avec les float (en 3D) et en effet les float génèrent pas mal de soucis.
Ci dessous un article sur Code Project (en Anglais) qui traite du sujet:
http://www.codeproject.com/Articles/...nt-Programming
Et la référence que donne l'auteur de l'article:
http://docs.oracle.com/cd/E19957-01/..._goldberg.html
En gros je pense qu'il n'y a pas de solution. Il faut arrondir à l'affichage.
Il y a au moins un autre article de CP qui traite su sujet. Des gens proposent des solutions de fonction qui testent l'égalité de manière fiable en passant par des fonctions maison.
En tout cas, merci à tous de vous être penchés sur mon problème, même s'il n'y a, à priori pas de solution.
Non , pas de solution simple. Nous on a finit par faire notre classe de nombres réels à partir des TBcd de Systools => le nombre est stocké dans une chaîne en interne => plus de soucis de précision.
Salut nirgal76
Je ne connaissais pas TBcd, j'ai fais un essai avec un bout de code adapte du Net, mais je ne comprend pas trop les résultats obtenu
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Fmtbcd.hpp" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; struct TBcd { Byte Precision; Byte SignSpecialPlaces; Byte Fraction[32]; }; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { unsigned char cUPin[4]; Fmtbcd::TBcd bcdPin = IntegerToBcd(12345678); Label1->Caption = BcdToStr(bcdPin); cUPin[0] = bcdPin.Fraction[3]; Label2->Caption = cUPin[0]; cUPin[1] = bcdPin.Fraction[2]; Label3->Caption = cUPin[1]; cUPin[2] = bcdPin.Fraction[1]; Label4->Caption = cUPin[2]; cUPin[3] = bcdPin.Fraction[0]; Label5->Caption = cUPin[3]; } //---------------------------------------------------------------------------
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
un exemple pour faire une addition de 2.3 + 0.1 et l'afficher :
Bon après, on a fait une classe et redéfinit les opérateurs, constructeurs etc pour l'utiliser comme un type standard
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include "StBcd.hpp" [...] Stbcd::TBcd op1; Stbcd::TBcd op2; Stbcd::TBcd resultat; ValBcd_C("2.3", op1); ValBcd_C("0.1", op2); AddBcd_C(op1, op2, resultat); ShowMessage(StrGeneralBcd(resultat));
J'ai utilisé la méthode suivante pour récupérer la vraie valeur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part double test = StrToFloat(EditMO->Text);
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager