zaokrąglenia po polsku



Oglądasz wersję archiwalną wątku "zaokrąglenia po polsku" z forum pl.comp.lang.delphi





Strona 1 z 11


Ty-grysek - 11 Lip 2005, 03:33

Witam!

Jak wiadomo ROUND zaokrągla wg amerykańskiego(?) schematu - niezgodnego z

naszemu, ale sęk w tym że zależy mi na dużej efektywności - jak powinienem
to zakodować? Interesuje mnie WYŁĄCZNIE zaokraglanie do 2-ch miejsc po
przecinku - także liczby ujemne.

Pozdrawiam
Tygrysek



Paweł Muszyński - 11 Lip 2005, 03:34


Witam!

Jak wiadomo ROUND zaokrągla wg amerykańskiego(?) schematu - niezgodnego z

naszemu, ale sęk w tym że zależy mi na dużej efektywności - jak powinienem
to zakodować? Interesuje mnie WYŁĄCZNIE zaokraglanie do 2-ch miejsc po
przecinku - także liczby ujemne.

Z ciekawości - jaka jest różnica pomiędzy zaokrąglaniem po polsku a po
amerykańsku?


Ty-grysek - 11 Lip 2005, 04:03



amerykańsku?



Róznice są tylko przy części ułamkowej 0.5, i tak:
- dla części całkowitej parzystej zaokrągla w dół*: round(2.5) = 2
- dla części całkowitej nieparzystej zaokrągla w górę*: round(3.5) = 4
natomiast w polskim systemie zaokrągla się zawsze w górę.
Matematycznie system amerykański(?) ma większy sens, ale żyjemy w polsce i
trzeba się dostosować :-)

*dla ujemnych odwrotnie


slaw...@seznam.cz - 11 Lip 2005, 03:56


Z ciekawości - jaka jest różnica pomiędzy zaokrąglaniem po polsku a po
amerykańsku?

banker's rounding


slaw...@seznam.cz - 11 Lip 2005, 04:04


Witam!
Jak wiadomo ROUND zaokrągla wg amerykańskiego(?) schematu - niezgodnego z

naszemu, ale sęk w tym że zależy mi na dużej efektywności - jak powinienem
to zakodować? Interesuje mnie WYŁĄCZNIE zaokraglanie do 2-ch miejsc po
przecinku - także liczby ujemne.



sprawdziłeś Round, RoundTo oraz SetRoundMode ???

Ty-grysek - 11 Lip 2005, 04:13

sprawdziłeś Round, RoundTo oraz SetRoundMode ???



Round działa jak opisałem. Co do pozostałych dwóch - manual milczy na ich
temat, kompliatur zgłasza "undeclared identifier" - także przy włączonym
"math". Delphi 5 Std.

HomeWork - 11 Lip 2005, 06:00


Witam!

Jak wiadomo ROUND zaokrągla wg amerykańskiego(?) schematu - niezgodnego z

naszemu, ale sęk w tym że zależy mi na dużej efektywności - jak
powinienem
to zakodować? Interesuje mnie WYŁĄCZNIE zaokraglanie do 2-ch miejsc po
przecinku - także liczby ujemne.
sprawdziłeś Round, RoundTo oraz SetRoundMode ???



Sznowni koledzy...
ja od wiekó robie tak:
np.
 x  := StrToCurr(FormatFloat('0.00',y));
gdzie
x, y : Currency

działa perfekcyjnie.

Pozdrawiam.


Marcin - 11 Lip 2005, 06:16


Witam!

Jak wiadomo ROUND zaokrągla wg amerykańskiego(?) schematu - niezgodnego z

naszemu, ale sęk w tym że zależy mi na dużej efektywności - jak powinienem
to zakodować? Interesuje mnie WYŁĄCZNIE zaokraglanie do 2-ch miejsc po
przecinku - także liczby ujemne.



Przy uruchomieniu programu wywołaj:
Set8087CW((Default8087CW or $800) and $FBFF);

M.


Paweł Pawlak - 11 Lip 2005, 06:34




amerykańsku?

Róznice są tylko przy części ułamkowej 0.5, i tak:
- dla części całkowitej parzystej zaokrągla w dół*: round(2.5) = 2
- dla części całkowitej nieparzystej zaokrągla w górę*: round(3.5) = 4
[...]
*dla ujemnych odwrotnie



Można to ująć znacznie prościej: dla części ułamkowej 0.5 Round
zaokrągla do najbliższej liczby parzystej. :)

Pozdrawiam,
Morris


barbara kozłowska - 11 Lip 2005, 07:47

zaokrąglają dolary


Witam!

Jak wiadomo ROUND zaokrągla wg amerykańskiego(?) schematu - niezgodnego z

naszemu, ale sęk w tym że zależy mi na dużej efektywności - jak
powinienem
to zakodować? Interesuje mnie WYŁĄCZNIE zaokraglanie do 2-ch miejsc po
przecinku - także liczby ujemne.

Z ciekawości - jaka jest różnica pomiędzy zaokrąglaniem po polsku a po
amerykańsku?



--
Wysłano z serwisu Usenet w portalu Gazeta.pl - http://www.gazeta.pl/usenet/


Bartek Dajewski - 11 Lip 2005, 11:47

Cześć.

Witam!

Jak wiadomo ROUND zaokrągla wg amerykańskiego(?) schematu - niezgodnego
z

po
naszemu, ale sęk w tym że zależy mi na dużej efektywności - jak
powinienem
to zakodować?
[...]
Sznowni koledzy...
ja od wiekó robie tak:
np.
 x  := StrToCurr(FormatFloat('0.00',y));
[...]
działa perfekcyjnie.

Działa, ale pytający pisał, że zależy mu na dużej efektywności, a powyższy
sposób jest pod tym względem fatalny. Dobry sposób (z użyciem Set8087CW)
podał Marcin, ale wymaga zmiany globalnych ustawień i nie można mieć
pewności czy np. jakiś komponent nie zmieni tego ustawienia w trakcie pracy
programu. Moim zdaniem najprostsza, wydajna i całkowicie bezpieczna metoda
to Int(x * 100 + 0.5) / 100 dla dodatnich i (... - 0.5) dla ujemnych.


Q - 12 Lip 2005, 07:52

Przy uruchomieniu programu wywołaj:
Set8087CW((Default8087CW or $800) and $FBFF);



"
Domyślnie w Delphi dokładność operacji zmiennoprzecinkowych ustawiona jest
na maksymalną dokładność. Jeśli wiemy, że w danym momencie algorytm nie
wymaga tak dużej precyzji możemy zmienić dokładność obliczeń - co w znaczy
sposób wpłynie na przyspieszenie pracy algorytmu. Dokonujemy tego zmieniając
słowo kontrolne (control word) jednostki FPU. W delphi wprowadzono specjalną
funkcję umożliwiającą zmianę statusu słowa kontrolnego: Set8087CW oraz
zmienną Default8087:

Single    Set8087CW(Default8087CW and $FCFF);
Double    Set8087CW((Default8087CW and $FCFF) or $0200);
Extended  Set8087CW(Default8087CW or $0300);

Od wersji Delphi 6 można również posługiwać się funkcją SetPrecisionMode(),
która ma o wiele prostszą składnię - ale tak naprawdę sprowadza się do
wykonania jednej z operacji przedstawionej w tabeli powyżej. Przypominam, że
przyspieszenie dotyczy wyłącznie operacji dzielenia. Twórcy Delphi zalecają
wykorzystanie zestawu tych funkcji przy obliczeniach dla OpenGL.
"

http://www.borland.pl/tech/optymalizacja_wydajnosci.shtml


Miroo - 13 Lip 2005, 05:45

Jak wiadomo ROUND zaokrągla wg amerykańskiego(?) schematu - niezgodnego z

naszemu, ale sęk w tym że zależy mi na dużej efektywności - jak powinienem
to zakodować? Interesuje mnie WYŁĄCZNIE zaokraglanie do 2-ch miejsc po
przecinku - także liczby ujemne.



Jak ci zależy na wydajności to operuj na liczbach całkowitych integer.
Będzie najszybciej.
Dopiero do wyświetlania formatuj liczby.

Wiem :) do tego musiałbyś przepisać całą aplikację.

Pozdrawiam
Miroo


Ty-grysek - 14 Lip 2005, 02:27

Jak ci zależy na wydajności to operuj na liczbach całkowitych integer.
Będzie najszybciej.
Dopiero do wyświetlania formatuj liczby.

Wiem :) do tego musiałbyś przepisać całą aplikację.



A czy nie tak właśnie działa currency? Bo tego typu używam :-)
No i to nie rozwiązuje problemu zaokragleń...

Pozdrawiam
Tygrysek


Miroo - 14 Lip 2005, 02:59

A czy nie tak właśnie działa currency? Bo tego typu używam :-)
No i to nie rozwiązuje problemu zaokragleń...



Z currency jest ten problem, że pamięta 4 miejsca po przecinku.
O możesz mieć np listę pozycji:
2,00
2,00
i sumę tego: 4,01 co trochę denerwuje użytkowników :)
Trzeba pamiętać, żeby w odpowiednich miejscach programu
golić liczbę do 2 miejsc po przecinku.

Co do amerykańskich zaokrągleń w currency - pojawiają
się chyba tylko na 4 miejscu po przecinku, co bardzo
zmniejsza błąd w porównaniu do floatów.

Możesz też się przyjrzeć typowi TBCD, ale jest chyba
zbyt niewygodny..

Pozdrawiam
Miroo


Miroo - 14 Lip 2005, 03:03

Co do amerykańskich zaokrągleń w currency - pojawiają
się chyba tylko na 4 miejscu po przecinku, co bardzo
zmniejsza błąd w porównaniu do floatów.



Hmmm, sorry. Przy wyświetlaniu (np FormatFloat('0.00')
faktycznie zaokrągla po hamerykańsku. Po prostu trzeba

Pozdrawiam
Miroo


Strona 1 z 11


Podobne tematy

Z Delphi pod Dosa oraz grupa o c++ po polsku
Czy istnieje specyfikacja API po polsku ?
MessageDlg po polsku
Kolory po polsku
zaokraglanie liczb rzeczywistych
Zaokrąglanie w FormatFloat
strumienie
news.bsc.public.borland ????
Delphi personal a Bazy danych - komponenty
strona FPC
  • zageszczarki gruntu
  • autoblokada n73 bez wpisywania kodu
  • sandaly ready
  • sms otrzymac pluskod
  • urzad;gminy;w;polancu
  • Stół rozkładany
  • Koło Armatura
  • dostęp do neostrady
  • Portret miasta Konkurs fotograficzny
  • Zestawienie wypowiedzi z grup dyskusyjnych / Indeks