Discussion:
Jak zaokraglic liczbe do dwoch miejsc po przecinku ?
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
lukiz-m
2006-04-20 20:35:42 UTC
Permalink
Witam!

Mylsalem ze sprawa jest banalna, ale jednak okazalo sie inaczej. Moglby
mi ktos poradzic jakies uzyc funkcji, aby zaokraglic liczbe typu double do
dwoch miejsc po przecinku - ztym ze zawsze zaokraglenie ma byc w góre.
Chodzi poprostu o kwoty pieniężne, a wiec konieczne sa dwa miejsca po
przecinku W GÓRE!! próbowałem z funkcją RoundTo(...) np.

RoundTo(1.234, -2)
Dołączyem bibliotekę w ktorej fa funkcja powinna byc zdefiniowana
poleceniem :
#include<math.h>

jednak kompilator funkcji jej nie rozpoznaje. Bede bardzo wdzieczny za
pomoc.

(środowisko: C++ Borland Builder 6)

pozdrawiam

lukiz-m
luki
2006-04-20 21:32:30 UTC
Permalink
Jesli pisze w Builderze to ja kiedys zrobilem cos takiego:
Caption=FloatToStrF(suma,ffCurrency,10,2);

Lukasz
Marcin 'Qrczak' Kowalczyk
2006-04-20 21:59:33 UTC
Permalink
Moglby mi ktos poradzic jakies uzyc funkcji, aby zaokraglic liczbe
typu double do dwoch miejsc po przecinku - ztym ze zawsze
zaokraglenie ma byc w góre. Chodzi poprostu o kwoty pieniężne,
Trzymanie kwot pieniężnych w typie double to proszenie się o kłopoty.

Prosty przykład: różnica między 12.33999999999 a 12.34000000001 jest
niewielka (może wynikać z zaokrągleń przy obliczaniu procentu, gdzie
oprocentowanie nie miało dokładnej reprezentacji w typie double),
ale po zaokrągleniu w górę jedno dane 12.34, a drugie 12.35.
--
__("< Marcin Kowalczyk
\__/ ***@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
Witold Kuzminski
2006-04-21 01:42:47 UTC
Permalink
Post by Marcin 'Qrczak' Kowalczyk
Moglby mi ktos poradzic jakies uzyc funkcji, aby zaokraglic liczbe
typu double do dwoch miejsc po przecinku - ztym ze zawsze
zaokraglenie ma byc w góre. Chodzi poprostu o kwoty pieniężne,
Trzymanie kwot pieniężnych w typie double to proszenie się o kłopoty.
Znowu zaczynasz?

Trzymanie kwot w double jak trzymanie napisow w std::string i liczb calkowitych w
typie int albo unsigned int, oraz wiekszosc innych dowolnie wybranych czynnosci
w C++ to proszenie sie o klopoty, gdy ktos nie rozumie z czym ma do czynienia.
Niestety, takie jest zycie: czesc osob sobie z tymi trudnymi problemami radzi,
a czesc nie. C'est la vie.
Post by Marcin 'Qrczak' Kowalczyk
Prosty przykład: różnica między 12.33999999999 a 12.34000000001 jest
niewielka (może wynikać z zaokrągleń przy obliczaniu procentu, gdzie
oprocentowanie nie miało dokładnej reprezentacji w typie double),
ale po zaokrągleniu w górę jedno dane 12.34, a drugie 12.35.
A ile we wszystkich innych rodzajach zaokraglania? I ktory rodzaj zaokraglania
doradzasz wybrac dla kwot pienieznych?
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
yamma
2006-04-21 08:03:16 UTC
Permalink
Post by Witold Kuzminski
Post by Marcin 'Qrczak' Kowalczyk
Moglby mi ktos poradzic jakies uzyc funkcji, aby zaokraglic liczbe
typu double do dwoch miejsc po przecinku - ztym ze zawsze
zaokraglenie ma byc w góre. Chodzi poprostu o kwoty pieniężne,
Trzymanie kwot pieniężnych w typie double to proszenie się o kłopoty.
Znowu zaczynasz?
Ma rację. Zresztą był tutaj już taki wątek:
http://groups.google.pl/group/pl.comp.lang.c/browse_frm/thread/afaf330378fe3c57/25022b659a1a4cab?lnk=st&q=waluta%2C+float&rnum=7&hl=pl#25022b659a1a4cab
yamma
Tomek Nurkiewicz
2006-04-20 22:03:27 UTC
Permalink
Post by lukiz-m
Moglby
mi ktos poradzic jakies uzyc funkcji, aby zaokraglic liczbe typu double do
dwoch miejsc po przecinku - ztym ze zawsze zaokraglenie ma byc w góre.
Najlepiej nie używaj funkcji specyficznych dla środowiska do tak
podstawowych zadań. W bibliotece standardowej C znajdziesz funkcje floor()
oraz ceil() która zaokrąglają do dołu i do góry do liczb całkowitych. A
stąd już tylko krok do rozwiązania Twojego problemu.

Ponadto przejrzyj wątek o reprezentowaniu walut w komputerze (typy
zmiennoprzecinkowe vs całkowite) niedawno na tej grupie.


pozdrowienia
--
Tomek Nurkiewicz
http://www.cute.xt.pl - Tetris 3D
In order to send me an e-mail remove the dot between "N" and "u"
Adam Wysocki
2006-04-21 02:49:30 UTC
Permalink
Post by lukiz-m
Mylsalem ze sprawa jest banalna, ale jednak okazalo sie inaczej. Moglby
mi ktos poradzic jakies uzyc funkcji, aby zaokraglic liczbe typu double
do dwoch miejsc po przecinku - ztym ze zawsze zaokraglenie ma byc w góre.
Ja wiem, że późna pora, więc pewnie naokoło, ale lepsze to niż nic...

double zaokr (double val)
{
int val_mul = (int) (val * 100);
return (val_mul % 100) ? (double) (val_mul / 100 + 1) : val;
}

[***@avenger ~]$ for n in 1 1.2 1.01 1.001; do ./dupa $n; done
1.000000 -> 1.000000
1.200000 -> 2.000000
1.010000 -> 2.000000
1.001000 -> 1.001000

Wygląda że działa...
--
http://www.chmurka.net/ :: FidoNet 2:480/138 :: GG 1234 :: Grono 123
gophi, wyglądasz trochę gangsta... (C) Cyberdude @ GG 29 lutego 2004
W prezencie dla spamerów: http://polish-026742789230.spampoison.com/
Adam Wysocki
2006-04-21 02:52:07 UTC
Permalink
Post by lukiz-m
Mylsalem ze sprawa jest banalna, ale jednak okazalo sie inaczej. Moglby
mi ktos poradzic jakies uzyc funkcji, aby zaokraglic liczbe typu double do
dwoch miejsc po przecinku - ztym ze zawsze zaokraglenie ma byc w góre.
Chodzi poprostu o kwoty pieniężne, a wiec konieczne sa dwa miejsca po
przecinku W GÓRE!! próbowałem z funkcją RoundTo(...) np.
Ja wiem, że późna pora, więc pewnie naokoło, ale lepsze to niż nic...

double zaokr (double val)
{
int val_mul = (int) (val * 100);

return (double) (val_mul / 100 + ((val_mul % 100) ? 1 : 0));
}

[***@avenger ~]$ for n in 1 1.1 1.01 1.001; do ./dupa $n; done
1.000000 -> 1.000000
1.100000 -> 2.000000
1.010000 -> 2.000000
1.001000 -> 1.000000

Wygląda na to że działa.
--
http://www.chmurka.net/ :: FidoNet 2:480/138 :: GG 1234 :: Grono 123
łysa dziewczyna to odpowiednik chłopaka z długimi włosami -- futszaK
W prezencie dla spamerów: http://polish-316801644853.spampoison.com/
Geo
2006-04-21 05:42:59 UTC
Permalink
Chyba cie facet pokrecilo - zaokraglaj grosze, a nie zlotowki, bo cie
za taki program zamkna w pace!!!
Geo
2006-04-21 05:57:55 UTC
Permalink
Chyba bardziej uczciwy jest taki sposob:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
double k1,k2;

cout << "kwota : ";
cin >> k1;
k2 = (double)((unsigned)((k1 * 100) + 0.5)) / 100;
cout << "\n\nkwota = " << k2 << endl << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Tomasz Kaczanowski
2006-04-21 06:57:37 UTC
Permalink
Post by Geo
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
double k1,k2;
cout << "kwota : ";
cin >> k1;
k2 = (double)((unsigned)((k1 * 100) + 0.5)) / 100;
cout << "\n\nkwota = " << k2 << endl << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
To dziala, tylko male ale, nie wedlug zalozen pytajacego :))
--
Kaczus/Pegasos User
http://kaczus.republika.pl
Geo
2006-04-21 10:04:23 UTC
Permalink
Nikt nie twierdzi, ze jest to dokladna odpowiedz (niech sobie pytajacy
troche pomysli), tylko ze jest to bardziej uczciwe od zaokraglania do
zlotowek :) (patrz - pierwszy wiersz !!!)

Loading...