[C++] Afronden/Precisie Double

Pagina: 1
Acties:

  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
Ik ben net begonnen met c++ voor school (heb al wat java kennis) en moet een simpel programma schrijven maar ik moet daar een double in afronden tot 2 getallen achter de komma. In een simpele console window kan je dat doen met setprecision(2) maar dat werkt niet echt in een applicatie (WINAPI). Teminste bij mij niet :D. Anyway ik heb dus ff gezocht in borland's help files en daar vond ik RoundTo(getal,precisie). Maar als ik dat gebruik krijg ik de volgende error:

code:
1
[C++ Error] Unit1.cpp(42): E2268 Call to undefined function 'RoundTo'


Kortom hij kan de functie niet vinden. En ja ik heb math geinclude met #include <math>. Kan hem ook zelf schrijven maar dan heb je functie round nodig en die kan die vervolgens ook nie vinden :?

Iemand enig idee? 8)7

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Je kan toch ook dit doen?

C++:
1
d = (double) ((int) (dubbel1 * 100))/100;


:7

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Gebruik stringstreams:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main () {

  stringstream oss;
  string mystr;

  double value;

  oss << setprecision(2) << value;
  mystr=oss.str();

  cout << mystr;

  return 0;
}

He who knows only his own side of the case knows little of that.


  • windancer
  • Registratie: Maart 2000
  • Laatst online: 18-08 22:36
Misschien heb je de math library niet meegelinkt ? Ik heb geen idee hoe dat moet met Borland; met gcc doe je dat door tijdens het linken -lm (leonard, marinus) als optie mee te geven.
GF schreef op 17 November 2002 @ 04:02:
Ik ben net begonnen met c++ voor school (heb al wat java kennis) en moet een simpel programma schrijven maar ik moet daar een double in afronden tot 2 getallen achter de komma. In een simpele console window kan je dat doen met setprecision(2) maar dat werkt niet echt in een applicatie (WINAPI). Teminste bij mij niet :D. Anyway ik heb dus ff gezocht in borland's help files en daar vond ik RoundTo(getal,precisie). Maar als ik dat gebruik krijg ik de volgende error:

code:
1
[C++ Error] Unit1.cpp(42): E2268 Call to undefined function 'RoundTo'


Kortom hij kan de functie niet vinden. En ja ik heb math geinclude met #include <math>. Kan hem ook zelf schrijven maar dan heb je functie round nodig en die kan die vervolgens ook nie vinden :?

Iemand enig idee? 8)7

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Weet je zeker dat die functie in de math library zit trouwens, ik kan em niet vinden in een reference op internet. En hoor je eigenlijk ook niet math.h te includen?

He who knows only his own side of the case knows little of that.


  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
@mithalph
Das toch geen afronden op decimalen :? vb. 18.11992 word in dit geval 18.11. Ziet er leuk uit maar is dus geen afronden :P

@RickN
Heb het ff geprobeerd maar krijg de volgende errors:
code:
1
2
3
  [C++ Error] Unit1.cpp(63): E2141 Declaration syntax error
  [C++ Error] Unit1.cpp(64): E2316 'oss' is not a member of 'stringstream'
  [C++ Error] Unit1.cpp(66): E2034 Cannot convert 'stringstream' to 'AnsiString'


Die laatste is omdat ik het in een label wil zetten. Heb het ook al willen toekennen naar gewone string maar lukt niet

@windancer
Ik heb hem geinclude en ik heb ook Math.RoundTo gebruikt maar da werkt ook niet

@RickN
math.h word gebruikt in c. In c++ is math genoeg. Maakt dus geen verschil of je er .h achter zet

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 28-08 22:22

Creepy

Tactical Espionage Splatterer

GF schreef op 17 november 2002 @ 12:57:
Ja ik weet hoe het met stringstreams werkt maar zoals gezegd wer ik niet met een console maar met een windows gui. M'n text moet in dit geval in een label komen.
Die oss.str() kan je toch op dat label zetten??

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

GF schreef op 17 november 2002 @ 12:57:
@mithalph
Das toch geen afronden op decimalen :? vb. 18.11992 word in dit geval 18.11. Ziet er leuk uit maar is dus geen afronden :P
Oeps :z

Nou, dit dan? :)
C:
1
2
3
4
5
6
7
8
9
10
main()
{
        double d;
        double e;

        e = 1.436542;
        d = (double) ((int) ((e * 100)+.5))/100;

        printf("%f\n",d);
}
Dit geeft 1.44 ...

Bagger c++-compiler op school...hij linkt tegen een library die hij niet kan vinden 8)7

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 05-08 18:36
GF schreef op 17 november 2002 @ 12:57:
[...]
@RickN
Heb het ff geprobeerd maar krijg de volgende errors:
code:
1
2
3
  [C++ Error] Unit1.cpp(63): E2141 Declaration syntax error
  [C++ Error] Unit1.cpp(64): E2316 'oss' is not a member of 'stringstream'
  [C++ Error] Unit1.cpp(66): E2034 Cannot convert 'stringstream' to 'AnsiString'
[...]
Of je leest die errors even en kijkt even in de code die je net hebt ge-copy-paste en je ziet dat er een puntkomma achter "double value" mist... :/

edit:
die RickN er net even sneeky achterzet :)

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
edit:
die RickN er net even sneeky achterzet :)
Jahaa, maar check mijn edit time, ik deed het vóór jij poste :P

He who knows only his own side of the case knows little of that.


  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
mithalph schreef op 17 november 2002 @ 13:08:
[...]
Oeps :z

Nou, dit dan? :)
C:
1
2
3
4
5
6
7
8
9
10
main()
{
        double d;
        double e;

        e = 1.436542;
        d = (double) ((int) ((e * 100)+.5))/100;

        printf("%f\n",d);
}
Dit geeft 1.44 ...

Bagger c++-compiler op school...hij linkt tegen een library die hij niet kan vinden 8)7
Vet die werkt :p. heb wel die printf statement eruit gegooid maar dat maakt niet uit. Aangezien ik toch nog wat wil leren ipv kopieren plakken wou ik vragen of je het ook kon toelichten (mits dat niet te veel werk is). Volg hem niet helemaal 8)7

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 05-08 18:36
RickN: Toen ik begon met typen stond ie er nog niet. :P

  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
Ericston schreef op 17 november 2002 @ 13:14:
[...]

Of je leest die errors even en kijkt even in de code die je net hebt ge-copy-paste en je ziet dat er een puntkomma achter "double value" mist... :/

edit:
die RickN er net even sneeky achterzet :)
Uhm nee :D ik heb die variabele niet eens gebruikt. Ik had al een double! dus geen ; vergeten. Dus niet te gehaast zijn met de beschuldigen svp

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 05-08 18:36
GF schreef op 17 november 2002 @ 13:19:
Vet die werkt :p. heb wel die printf statement eruit gegooid maar dat maakt niet uit. Aangezien ik toch nog wat wil leren ipv kopieren plakken wou ik vragen of je het ook kon toelichten (mits dat niet te veel werk is). Volg hem niet helemaal 8)7
Dat zijn een paar C-style typecasts, ik zou echt gaan voor RickNs oplossing. Je bent immers met C++ bezig.

  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
mjah die werkt alleen niet zoals ik zei Ericston. En ik wil best iets nets maken maar als dat niet werkt dan houd het op. Snap zowieso al niet waarom die ingebakken RoundTo() niet kan vinden terwijl de API zegt dat hij in de math zit.

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 05-08 18:36
#include <iomanip> moest er nog even bij. Wat ownen die references toch... :)
Als je graag met functies als RoundTo() wil werken ben je in de verkeerde taal bezig.
GF schreef op 17 November 2002 @ 13:20:
[...]
Uhm nee :D ik heb die variabele niet eens gebruikt. Ik had al een double! dus geen ; vergeten. Dus niet te gehaast zijn met de beschuldigen svp
Sorry voor dat, maar die errors zijn dan een beetje vaag. In MSVC++ krijg ik gewoon te zien dat setprecision een undeclared identifier is.
Enneh, die errors zeggen natuurlijk niets als je de code er niet bij vermeldt. Ik ging dus gewoon van RickNs code uit terwijl je hem zelf al had aangepast. :)

[ Voor 0% gewijzigd door Ericston op 17-11-2002 13:43 . Reden: frappante dt fout ]


  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Oeps :+

He who knows only his own side of the case knows little of that.


  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
Waarom staat er dan in de API dat die fucntie er is. Snap dat dan niet :?. Zal nog ff die van rickn proberen icm jouw include :D;)

  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
Dat scheelt idd ja die import. Nu zit er alleen 1 probje in.
Zodra ik (heb dit als een functie geschreven) return mystr; doe dan geeft hij de volgende error:
code:
1
[C++ Error] Unit1.h(54): E2285 Could not find a match for 'AnsiString::operator =(string)'


Het is dus iets met het omzetten van een ansistring naar normale string. Is daar nog een functie voor om dit te doen? en ook om het naar een normale double terug te casten?

Heb al ToDouble() en ToString() geprobeerd maar dan zegt die dan deze functie niet een member is van string

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Ja, ik zit het ook te proberen, en ik weet nu waarom borland kut is :(
Die achtelijke AnsiString wrapper van ze vreet geen gewone standaard strings en ik zou niet weten hoe je tussen die twee kunt casten.

He who knows only his own side of the case knows little of that.


  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
En ik maar denken dat borland zo goed was :'(

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
probeer dit es:

C++:
1
Edit1->Text = oss.str().c_str();

He who knows only his own side of the case knows little of that.


  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
Dat werkt niet bij mij. Maar ik laat het wel zo als het nu is. Het is maar een schoolopdracht. Zal het wel aan m'n leraar vragen zodra ik weer les heb. Nu ga ik wel weer verder met de rest want dan afronden is niet zo super belangrijk vergeleken met rest van het programa.

Toch allemaal bedankt voor de moeite :) Kan dus slotje op ;)z

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

GF schreef op 17 November 2002 @ 12:57:
@RickN
math.h word gebruikt in c. In c++ is math genoeg. Maakt dus geen verschil of je er .h achter zet
dat klopt dus niet, in C++ zijn alle C-headers zonder .h en met c ervoor

dus:
#include <cstdio>
#include <cstdlib>
#include <cmath>

bovendien moet je niet denken dat de compiler (eigenlijk de preprocessor) er automatisch .h achter zet... als #include <math> zou werken, dan include je dus een totaal andere file dan math.h

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.


  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
waarom pakt die als ik bijv functie pow pak (die in math zit) wel als ik #include <math> doe?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

omdat Borland zich niet aan de standaard houdt? :)
waarschijnlijk heeft borland een eigen math gemaakt, die vervolgens math.h weer include... met misschien ook nog eigen functiedeclaraties erin

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

Even voor de volledigheid: het verschil is dat de cname headers al hun prut in namespace std definieren/declareren.

  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
Weer wat geleerd vandaag :). Heb ik nog een vraagje over c++. Weleenswaar heeft die niet zo zeer wat te maken met afronden maar anders moet ik weer een nieuw topic openen voor een waarschijnlijk simpel antwoord.

Komt ie :P:

Ik wil een String samenstellen met behulp van normale text en variabelen. Ik heb het nu zo gedaan:
C++:
1
2
text += maandCount;
text += "\t\t";

Maar nu vind ik dit dus veelste lang en vrij onhandig. Met java en php kan je het gewoon zo doen:
code:
1
2
text += maandCount + "\t\t"; (Java)
text += maandCount . "\t\t"; (PHP)

Maar met +/. werkt dat niet in c++. Wat is wel de goede manier? En dan zonder die ansistrings svp (<<)

Alvast bedankt voor de moeite!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 01:23

Reptile209

- gers -

Ben meet van het Delphi/Pascal type :Y) , maar doet dit wat:
C:
1
text += intToStr(maandCount) + "\t\t";
Je hebt namelijk de cast naar string (vanaf int) nodig die door het object in twee stappen gedaan kan worden.

Zo scherp als een voetbal!


  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
Welke import moet ik daarvoor hebben. Hij pakt hem nml niet zo.

btw. borland heeft een kut help functie :(

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 01:23

Reptile209

- gers -

of probeer itoa uit stdlib.h eens (borland C++ for DOS 5.0):
char *itoa(int value, char *string, int radix); // (radix is het grondgetal: 10. Of je moet binair willen werken :) )

Zo scherp als een voetbal!


  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
Die itoa functie word ik ook niet veel weizer van :(

Kom net btw ook tot de conclusie dat de functie van mithalph niet werkt met grote getallen. Dan crasht het zaakje gewoon. Dit vanwege die int casting :(

  • GF
  • Registratie: April 2002
  • Laatst online: 22-12-2025
Ik heb eindelijk gevonden hoe je die string kan samenstellen. VB:

code:
1
text += String(maandCount) + "\t\t";


Zo das 1 :p
Pagina: 1