[ star_x @ 11.01.2006. 17:34 ] @
Moj problem se manifestuje u tome sto kada zelim da zaokruzim broj na odredjeni broj decimala ne mogu da ga zaokruzim na najblizu vrednost jer se zaokruzivanje vrsi na najblizu parnu vrednost.

Npr. broj 45,445 zaokruzuje na 45,44 umesto 45,45.

U kodu koristim funkciju RoundTo, a u SQL-u ROUND(x, -[brojdecimala]), obe funkcije isto zaokruzuju. Problem je jer se radi sa mnozenjem vecih vrednosti u queriju. U bazi cuvam podatke zaokruzene na dve decimale.

Probao sam sa funkcijom SetRoundMod(rmNearest) ali nisam dobio željeni rezultat.
Pomagajte jer sam u velikoj stisci s vremenom.

Hvala unapred!!!
[ Srki_82 @ 11.01.2006. 18:11 ] @
Koristi SimpleRoundTo.
[ star_x @ 11.01.2006. 18:26 ] @
Hvala na pokušaju, delomično je uspelo:

Probao sam:

FloatToStr(SimpleRoundTo(123.445, -2)) i dobio 123.44 kao rezultat.

ali kada sam postavio

SetRoundMode(rmTruncate)

pre poziva funkcije, profunkcionisalo je za sve primere.

Međutim ostaje problem kako da zaokruživanje ispravno funkcioniše u sql-u upita gde se javlja isti problem sa zaokruživanjem.




[Ovu poruku je menjao star_x dana 11.01.2006. u 20:22 GMT+1]
[ Srki_82 @ 11.01.2006. 22:16 ] @
Ovo je Delphi forum. Za probleme sa bazom i SQL-om pitaj u forumu za rad sa bazama.
[ ivanho @ 11.01.2006. 22:52 ] @
broj 45,445 zaokruzen na dve decimale
i jeste 45,44, a ne 45,45
ukoliko je cifra ispred 5 parna broj se zaokruzuje na manje, ukoliko je neparna zaokruzuje se na vece
[ Bojan Kopanja @ 11.01.2006. 23:58 ] @
Odnosno ukoliko je cifra ispred 5 parna ne dira se nista, a ako je neparna zaokruzuje se na vecu, parnu cifru .
[ star_x @ 12.01.2006. 02:12 ] @
Našao sam rešenje!
Ako se dobro sećam pri zaokruživanju na recimo dve decimale gleda se treca i ukoliko je ona 5 ili više druga se uvecava za jedan.
A što se tiče zaokruživanja koliko ja znam postoje četiri vrste: na gore, na dole, na najbližu celobrojnu vrednost i na najbližu parnu vrednost.
Ova poslednja se valjda koristi u statistici, ...
Ispred mene je stavljen zahtev da ispoštujem treće od gore nabrojanih zaokruživanja.

Iako pomislih da SimpleRoundTo ispravno radi posao pronašao sam sledeće rezulate
na jednom sajtu, a i sam sam primetio da nije baš uvek pouzdana.

SimpleRoundTo( 2.000,0) -> 2.00
SimpleRoundTo( 1.500,0) -> 2.00
SimpleRoundTo( 1.000,0) -> 1.00
SimpleRoundTo( 0.500,0) -> 1.00
SimpleRoundTo( 0.000,0) -> 0.00
SimpleRoundTo(-0.500,0) -> 0.00
SimpleRoundTo(-1.000,0) -> 0.00
SimpleRoundTo(-1.500,0) -> -1.00
SimpleRoundTo(-2.000,0) -> -1.00
SimpleRoundTo(-8.400,0) -> -7.00

Rešenje sam našao u sledećoj funkciji ako nekome zatreba:

function RoundUp(X: Extended; D: integer): Extended;
var y, f:Extended;
begin
f:= IntPower(10, D);
y:= x*f;
y := Trunc(y) + Trunc (Frac(y) * 2);
result:= y/f;
end;

Hvala u svakom slučaju !!!

[ vradovanovic @ 13.01.2006. 08:50 ] @
Citat:
star_x: Ako se dobro sećam pri zaokruživanju na recimo dve decimale gleda se treca i ukoliko je ona 5 ili više druga se uvecava za jedan.
A što se tiče zaokruživanja koliko ja znam postoje četiri vrste: na gore, na dole, na najbližu celobrojnu vrednost i na najbližu parnu vrednost.
Ova poslednja se valjda koristi u statistici, ...


Postoji samo jedna jedina vrsta zaokruživanja: kada je poslednja cifra 5, koristi se pravilo parne cifre. I koristi se svuda: u matematici, u statistici, u knjigovodstvu, ... Ako neko zna neki primer gde se koristi neki drugi način, neka me ispravi da ne živim u zabludi

Pozdrav,

Veljko
[ broker @ 13.01.2006. 09:35 ] @
Imaju knjigovodje svoje zaokruzivanje.
[ star_x @ 13.01.2006. 16:36 ] @
Citat:
vradovanovic: Postoji samo jedna jedina vrsta zaokruživanja: kada je poslednja cifra 5, koristi se pravilo parne cifre.


U tom slučaju bi sledeće četiri funkcije iz Excela:

ROUNDUP
ROUNDDOWN
EVEN
ODD

kao i sledeće nabrojane iz Delphija:

setRoundMode(rmUp)
setRoundMode(rmDown)
setRoundMode(rmNearest)
setRoundMode(rmTruncate)

bile čist višak jer bi po defaultu zaokruživao po pravilu parne cifre.

Pozdrav!

[Ovu poruku je menjao star_x dana 13.01.2006. u 20:49 GMT+1]