Krzysztof
2008-08-19 11:15:51 UTC
Witam
Mam problem z zaokrąglaniem. Po przepuszczeniu przez funkcje SUM
pojawiają się dziwne rezultaty. Może ktoś już się spotkał z podobnym
problemem i pomoze.
Baza danych: MySQL 4.1, platforma Windows
Pola bazy danych do przechowywania wartości to float:
CREATE TABLE `fakturypozycje` (
(..)
`Cena_netto` float default NULL,
`Wartosc_netto` float default NULL,
`Wartosc_VAT` float default NULL,
`Wartosc_brutto` float default NULL,
(..)
Zawartość bazy danych:
SELECT
Wartosc_netto as SUM_Netto,
Wartosc_VAT as SUM_VAT,
Wartosc_brutto as SUM_Brutto,
Nazwa,
Symbol, procent
FROM fakturypozycje, stawkivat
WHERE Faktura_id=10 AND Stawka_VAT_ID=SYMBOL
SUM_Nettto: 148621
SUM_VAT: 32696,7
SUM_Brutto: 181318
Sa to wartosci poprawne.
Jak zapodaje grupowanie i sumowanie (jedna pozycja):
SELECT
SUM(Wartosc_netto) as SUM_Netto,
SUM(Wartosc_VAT) as SUM_VAT,
SUM(Wartosc_brutto) as SUM_Brutto,
Nazwa,
Symbol, procent
FROM fakturypozycje, stawkivat
WHERE Faktura_id=10 AND Stawka_VAT_ID=SYMBOL
GROUP BY Stawka_VAT_ID
SUM_Nettto: 148621,265625
SUM_VAT: 32696,6796875
SUM_Brutto: 181317,953125
Probowalem sztuczki z zaokraglaniem:
ROUND(SUM(Wartosc_netto),2) as SUM_Netto,
nie dziala poprawnie.
SUM_Nettto: 148621,27
SUM_VAT: 32696,68
SUM_Brutto: 181317,95
Dla mniejszych wartosci nie ma problemu.
Wydaje mi sie ze na serwerze nastepuje konwersja typu, dane sa
przechowywane w pamieci podrecznej jako double a zczytywane jako float.
Podobne jazdy były z typem currency w Delphi. Chodzilo o sposob
przechowywania wartosci w pamieci.
Bede jeszcze cwiczyl zmiane typu pol na double, zobaczymy co przyniesie.
Znalazlem cos takiego:
http://bugs.mysql.com/bug.php?id=25619
sugeruja uzycie round(x,2), ale jak widac - nie dziala to najlepiej
Pozdrawiam
Krzysztof Czajka
Mam problem z zaokrąglaniem. Po przepuszczeniu przez funkcje SUM
pojawiają się dziwne rezultaty. Może ktoś już się spotkał z podobnym
problemem i pomoze.
Baza danych: MySQL 4.1, platforma Windows
Pola bazy danych do przechowywania wartości to float:
CREATE TABLE `fakturypozycje` (
(..)
`Cena_netto` float default NULL,
`Wartosc_netto` float default NULL,
`Wartosc_VAT` float default NULL,
`Wartosc_brutto` float default NULL,
(..)
Zawartość bazy danych:
SELECT
Wartosc_netto as SUM_Netto,
Wartosc_VAT as SUM_VAT,
Wartosc_brutto as SUM_Brutto,
Nazwa,
Symbol, procent
FROM fakturypozycje, stawkivat
WHERE Faktura_id=10 AND Stawka_VAT_ID=SYMBOL
SUM_Nettto: 148621
SUM_VAT: 32696,7
SUM_Brutto: 181318
Sa to wartosci poprawne.
Jak zapodaje grupowanie i sumowanie (jedna pozycja):
SELECT
SUM(Wartosc_netto) as SUM_Netto,
SUM(Wartosc_VAT) as SUM_VAT,
SUM(Wartosc_brutto) as SUM_Brutto,
Nazwa,
Symbol, procent
FROM fakturypozycje, stawkivat
WHERE Faktura_id=10 AND Stawka_VAT_ID=SYMBOL
GROUP BY Stawka_VAT_ID
SUM_Nettto: 148621,265625
SUM_VAT: 32696,6796875
SUM_Brutto: 181317,953125
Probowalem sztuczki z zaokraglaniem:
ROUND(SUM(Wartosc_netto),2) as SUM_Netto,
nie dziala poprawnie.
SUM_Nettto: 148621,27
SUM_VAT: 32696,68
SUM_Brutto: 181317,95
Dla mniejszych wartosci nie ma problemu.
Wydaje mi sie ze na serwerze nastepuje konwersja typu, dane sa
przechowywane w pamieci podrecznej jako double a zczytywane jako float.
Podobne jazdy były z typem currency w Delphi. Chodzilo o sposob
przechowywania wartosci w pamieci.
Bede jeszcze cwiczyl zmiane typu pol na double, zobaczymy co przyniesie.
Znalazlem cos takiego:
http://bugs.mysql.com/bug.php?id=25619
sugeruja uzycie round(x,2), ale jak widac - nie dziala to najlepiej
Pozdrawiam
Krzysztof Czajka