Toon posts:

afronden in C++

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

Verwijderd

Topicstarter
Ik ben een newbie op het gebied van programmeren en nou was ik bezig met 1 van mijn eerste programma's: het omrekenen van euro naar gulden en andersom maar nou wil ik dus afronden op 2 getallen achter de komma en ik wil het doen met setprecision maar hoe werkt dat precies ??

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17:42

Janoz

Moderator Devschuur®

!litemod

Waarom die je dat niet gewoon bij het printen?
code:
1
 printf("E %f#.##",fWaardeInEuro);

(/me doet een gokje, werkt niet vaak met c.)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Jelmer
  • Registratie: Maart 2000
  • Nu online
Janoz, hij vraagt c++ niet c.....
code:
1
2
3
4
5
6
#include <iomanip.h>
.
.
.
.
cout<<setprecision(2)<<myFloat;

Dus je bedrag wordt niet veranderd als je dit uitvoerd he! myFloat wordt dan met een precisie van 2 decimalen op het scherm afgedrukt...

Als je echt netjes wil afronden kun je het beter zo doen
code:
1
2
3
4
5
6
#include <math.h>
.
.
.
.
myFloat=floor(myFloat*100)/100;

Je zou eventueel floor door ceil kunnen verandern (floor is naar beneden en ceil is naar boven afronden)

  • hufkes
  • Registratie: Maart 2000
  • Laatst online: 10-12 00:45

hufkes

nee, daar staat niet hufter!

setprecision
SMANIP( int ) setprecision( int np );

#include <iomanip.h>

Parameter

np

An integer that indicates the number of significant digits or significant decimal digits to be used for floating-point display.

Remarks

This parameterized manipulator sets the streams internal floating-point precision variable to np. The default precision is six digits. If the display format is scientific or fixed, then the precision indicates the number of digits after the decimal point. If the format is automatic (neither floating point nor fixed), then the precision indicates the total number of significant digits. This setting remains in effect until the next change.
Lijkt me niet echt de methode.... meer iets in de trant van maal 100 en dan weer div

Wellicht later een werkend stukje code

Onderstaande signature is al >20jr oud ***hoe dan***
---
Het internet is een veelbelovend medium
....dat maar heel weinig van zijn beloftes nakomt.
Wat weg is... raak je nooit meer kwijt :P


  • Bigs
  • Registratie: Mei 2000
  • Niet online
Ik gebruik ook altijd setpercision (c++ nog niet zo lang), maar weet niet of die wel of niet goed afrond.

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op dinsdag 25 september 2001 22:34 schreef hufkes het volgende:

[..]

Lijkt me niet echt de methode....
waarom zou dat niet goed zijn dan? :?
meer iets in de trant van maal 100 en dan weer div

Wellicht later een werkend stukje code
dat kan ja, maar is niet echt efficient.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
setprecision is de weg, hoe je het ook wendt of keert, wanneer je een float print zal je altijd (de laatste bits zijn praktisch random bij floats) een getal krijgen als 10.000011 zonder setprecision. (Dus met die *100 / 100 truuk bv)

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 12-12 22:15
Op dinsdag 25 september 2001 22:34 schreef Jelmer Barhorst het volgende:
Janoz, hij vraagt c++ niet c.....
code:
1
2
3
4
5
6
#include <iomanip.h>
.
.
.
.
cout<<setprecision(2)<<myFloat;

Dus je bedrag wordt niet veranderd als je dit uitvoerd he! myFloat wordt dan met een precisie van 2 decimalen op het scherm afgedrukt...
Dat is dus geen afronden, dit is gewoon niet weergeven.
Als je echt netjes wil afronden kun je het beter zo doen
code:
1
2
3
4
5
6
#include <math.h>
.
.
.
.
myFloat=floor(myFloat*100)/100;

Je zou eventueel floor door ceil kunnen verandern (floor is naar beneden en ceil is naar boven afronden)
Dit is bijna goed, maar nog net niet helemaal.

Je moet het zo doen:
code:
1
myFloat=floor((myFloat*100)+0.5)/100;

Nu denk je: wat de fuck? Waarom 0.5 er bij optellen?
Simpel:
Met floor wordt:
5.0->5.0
5.1->5.0
5.2->5.0
5.3->5.0
5.4->5.0
5.5->5.0
5.6->5.0
5.7->5.0
5.8->5.0
5.9->5.0
6.0->5.0

Je rond altijd naar beneden af.

Stel je doet zoals ik aangeef, dus 0.5 en dan floor:
5.0->5.5->5.0
5.1->5.6->5.0
5.2->5.7->5.0
5.3->5.8->5.0
5.4->5.9->5.0
5.5->6.0->6.0
5.6->6.1->6.0
5.7->6.2->6.0
5.8->6.3->6.0
5.9->6.4->6.0
6.0->6.5->6.0

En dat is zoals je ziet, netjes afgerond met .5 naar boven afgerond en < .5 naar beneden afgerond.


Voorbeeldjes:

100.2565464654
//*100
10025.65464654
//+0.5
10026.15464654
// floor()
10026.0
// /100
100.26
Netjes afgerond zoals je wilt. Ga zelf maar een paar keer na dit. 't is trouwens basis programmeren dit. Staat in elk basis ANSI/ISO C++ boek dit.

Die floor functie knalt alles achter de komma weg.
Ceil doet hetzelfde als floor, maar telt er eerst 1 bij op.

  • Grum
  • Registratie: Juni 2001
  • Niet online
Op woensdag 26 september 2001 00:24 schreef The - DDD het volgende:

[..]
6.0->5.0

Je rond altijd naar beneden af.
ik meen dat dit een typo is ? :)

en ceil doet floor + 1 ?

ceil 5.0 is dus 6.0 ?

dont think so :P

Verwijderd

Topicstarter
ok bedankt hier ben ik echt een stuk wijzer van geworden maar nou nog een vraagje hoe zet je de punten precies onder elkaar ??

  • RdeTuinman
  • Registratie: Mei 2001
  • Laatst online: 20:50
Op woensdag 26 september 2001 18:57 schreef Da_Hulst het volgende:
ok bedankt hier ben ik echt een stuk wijzer van geworden maar nou nog een vraagje hoe zet je de punten precies onder elkaar ??
Je zou bijvoorbeeld kunnen doen:
code:
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <iomanip>

..

i = 53.42;
j = 1482.94;
cout << setw(8) << i << endl;
cout << setw(8) << j << endl;

Nu 'reserveer' je dus 8 karakters voor het getal en ze worden rechts uitgelijnd.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 01:59

curry684

left part of the evil twins

Op woensdag 26 september 2001 18:57 schreef Da_Hulst het volgende:
ok bedankt hier ben ik echt een stuk wijzer van geworden maar nou nog een vraagje hoe zet je de punten precies onder elkaar ??
Zucht waarom nou dat geemmer met cout jongens die gozer wil gewoon iets netjes recht uitgeprint hebben, en daarvoor pak je printf voor de gebruiksvriendelijkheid en handigheid. M'n aars dat het een C-functie is, hij werkt.

Dus:
code:
1
2
3
4
5
6
7
8
9
10
11
int main()
{
float   l_MyNumber = 3.14;
int     l_Index;

for(l_Index = 0; l_Index != 10; l_Index++)
  {
  printf("%10.2f\n", l_MyNumber);
  l_MyNumber *= l_MyNumber;
  }
}

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 27 september 2001 11:18 schreef curry684 de waarheid
idd, helemaal mee eens, en ik wordt echt niet goed van al dat gepiep dat het niet c++ is. Man wat maakt dat nou uit? c++ is een uitbreiding van c, geen vervanger. Dus waarom niet gewoon printf gebruiken? Het is een robuuste functie die doet wat je wilt, en waarvoor geen wazige constructies nodig zijn met manipulators enzo. Klaar, punt uit!

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.


Verwijderd

OiSyN: c++ is een uitbreiding van c, geen vervanger.
Hmm....
Dus waarom niet gewoon printf gebruiken? Het is een robuuste functie die doet wat je wilt, en waarvoor geen wazige constructies nodig zijn met manipulators enzo.
Eens. Gebruik wat werkt.
Pagina: 1