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 "
Version imprimable
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 "
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:
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]; } //---------------------------------------------------------------------------
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 standardCode:
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));