Toon posts:

[C++] afronden op 2 decimalen

Pagina: 1
Acties:
  • 1.079 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Kan iemand me vertellen hoe dat je een getal in een Tedit box kunt afronden op een getal met 2 decimalen?
Ik heb hier al een c++ bible maar daar kan ik het niet in terug vinden,
Iemand die kan helpen?

Alvast bedankt!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

TEdit bevat een property Text van het type AnsiString, en AnsiString heeft een allerhande spannende methods (mainly Pos, SubString en Format) waarmee je dit zo voor mekaar kunt krijgen.

Professionele website nodig?


Verwijderd

Misschien moet je je "invoer waarden" met 2 komma's doen, of in je formule komma's gebruiken. Zo moet het in ieder geval in Java

  • grizzlybear
  • Registratie: Oktober 2001
  • Laatst online: 28-07 10:33
Volgens mij moet het zo:

code:
1
Format("%2.2d", variable);

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

@grizzlybear: zo formatteer je een integer met min 2 en max 2 cijfers. Probeer iets van deze strekking (ik heb geen VCL docs of BCB bij de hand):
C++:
1
2
// In de OnExit van je EditBox
MyEdit->Text = Format("%.2f", MyEdit->Text.ToFloat());

Dit gooit ook een exception bij foutieve waardes.

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Als dat getal moet ingegeven worden, kan je ook een TMaskEdit gebruiken, en zo de gebruiker dwingen om een getal in te geven met 2 decimalen.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Had ik ook al bedacht, maar volgens mij staat een TMaskEdit je niet toe een variabel aantal cijfers voor de komma te plaatsen, of te volstaan met 0 of 1 cijfers achter de optionele komma :)

Lang niet zo flexibel dus.

Professionele website nodig?


Verwijderd

Topicstarter
Bedankt voor de reacties, echter lukt het me nog steeds niet...
Ik heb nu de volgende code:

C++:
1
2
3
4
 i1 = StrToInt(aantal1->Text);
 i2 = StrToFloat(prijsexcl1->Text);
 tot = ((i2*i1));
 prijs_totaal1->Text = FloatToStr(tot);


Curry684, hoe zou ik jaar jouw bedrage in kunnen verwerken?
Ik heb vanalles geprobeerd maar krijg steeds fouten...

Alvast bedankt!

[ Voor 6% gewijzigd door Verwijderd op 08-06-2003 14:28 ]


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 22:25

Klippy

Still Game

C++:
1
prijs_totaal1->Text= Format("%.2f", tot);

Zoiets:?

Moet toch te doen zijn :P

Snap alleen je dubbele haakjes om de tot berekening niet.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Verwijderd

Topicstarter
Al geprobeerd, dan krijg ik alleen:
code:
1
2
E2110 Incompatible type conversion
E2193 Too few parameters in call to '_fastcall Format(const AnsiString,const TVarRec *,const int)'


Die dubbele haakjes zijn inderdaad overdreven :)

[ Voor 15% gewijzigd door Verwijderd op 09-06-2003 11:01 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Ja euh pak zelf de helpfiles, en zoek dan ff bij FloatToStrF.

Professionele website nodig?


  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 03:42

RayNbow

Kirika <3

Hier is een voorbeeldje hoe je een float kan afronden op 2 decimalen...
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
float a=1.23456f;

a*=100.0f; // a == 123.4567
a+=0.5f;   // a == 123.9567

a = float(int(a)) / 100.0f; // a == 1.23


a=1.23999f;

a*=100.0f; // a == 123.9999
a+=0.5f;   // a == 124.4999

a = float(int(a)) / 100.0f; // a == 1.24

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Nou niet dus, print dat getal a maar eens. Dat is heus geen 1.240000000000etc.

floats worden altijd binair opgeslagen, en niet decimaal. Je kunt dus niet twee decimalen opslaan (afgezien van ,25=1/4 en ,75=3/4 natuurlijk)

Overigens: Vaak is "twee decimalen" een poging om met bedragen in te rekenen. Dat is dus de foute aanpak, in zo'n geval moet je met een integer aantal centen rekenen, en alleen tijdens het printen de conversie doen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

alleen tijdens het printen de conversie doen
idd, en dan nog niet eens converteren naar float of double, maar bijvoorbeeld gewoon cout << (waarde / 100) << '.' << setfill ('0') << setw (2) << (waarde % 100)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Ja oisyn, knappe jongen hoe je dat in een TEdit kunt krijgen :) De goede functie is dus gewoon FloatToStrF maar daar we niets meer van TS horen gok ik dat ie er daarmee al uit kwam :P

Professionele website nodig?


Verwijderd

Topicstarter
TS Reporting,
Staying allive, en ben er nog steeds mee bezig....
Heb hier naast me dat dikke boek al liggen:
Borland C++Builder 6 Developer's Guide
Maar ook daar heb ik nog niets in gevonden.
Ik houd jullie op de hoogte, en als ik de oplossing heb, zal ik die hier zeker vermelden.....

Verwijderd

En heb je
C++:
1
prijs_totaal1->Text= Format("%.2f", tot, 0);

al geprobeerd?

Verwijderd

Topicstarter
Incompatible type conversion he ;) Maar toch bedankt!

Verwijderd

Er ontbrak een argument toen Format de eerste keer werd gegeven hier wat hoger ...
Nu staat dat derde argument er.

edit:
O ja die tot is een float en de tweede param moet een TVarRec* zijn :o
edit2:
Het werkt echt niet?
Komt nochtans uit de help bij bcc ;)

[ Voor 52% gewijzigd door Verwijderd op 09-06-2003 10:52 ]


Verwijderd

Topicstarter
TVarRec* pff, nu wordt het even te ingewikkeld :)
Wat ik nu heb gemaakt, maar niet helemaal werkt is het volgende:

C++:
1
prijs_totaal1->Text = FloatToStrF(tot,ffFixed,0,2);


Hij maakt er nu wel 2 decimalen van, maar die zijn altijd ,00

Verwijderd

en als je die 0 door 15 verandert :?

Verwijderd

Topicstarter
Inderdaad, ik was net een bericht aan het posten dat dat de fout was :)
C++:
1
 prijs_totaal1->Text = FloatToStrF(tot,ffFixed,15,2);

Met deze code lukt het :)
Bedankt allemaal voor alle hulp, eindelijk de oplossing!
Thanx!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

curry684 schreef op 09 juni 2003 @ 02:36:
Ja oisyn, knappe jongen hoe je dat in een TEdit kunt krijgen :) De goede functie is dus gewoon FloatToStrF maar daar we niets meer van TS horen gok ik dat ie er daarmee al uit kwam :P
Ik gaf een voorbeeld, er is vast ook wel een borland only variant van. Als je FloatToStrF gebruikt dan reken je alsnog met floats (en dus potentiele afrondingsfouten, wat je nou net niet wilt hebben met geldbedragen imho :))

Bovendien:

C++:
1
2
3
std::ostringstream str;
str << (waarde / 100) << '.' << setfill ('0') << setw (2) << (waarde % 100)
MyEdit->Text = str.c_str ();


:Y)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Kan ook via Delphi-native 'Currency' variabelen werken, da's een 10-byte float gespecialiseerd op internationale afspraken over bedragen (5 significante digits of zo).

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

5? Dat lijkt me erg weinig. Bovendien past dat ook wel in 3 bytes (10 bits exponent, 14 bits mantissa, om maar een voorbeeld te noemen)

of bedoel je fixed point getal met 5 cijfers achter de komma? :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

.oisyn schreef op 10 June 2003 @ 11:06:
5? Dat lijkt me erg weinig. Bovendien past dat ook wel in 3 bytes (10 bits exponent, 14 bits mantissa, om maar een voorbeeld te noemen)

of bedoel je fixed point getal met 5 cijfers achter de komma? :)
Uh die ja :)

Professionele website nodig?


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
* MSalters is weer blij dat ik meer dan 999,99 euros op m'n bankrekening mag hebben :)

Overigens dacht ik dat de norm 6 cijfers achter de komma was voor rekenwerk, en 5 cijfers voor opslag.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Kan, staat me iets bij van 5 dat ik ooit van m'n zus gehoord heb, maar kben niet echt zeker.

Professionele website nodig?

Pagina: 1