[MySQL] Problemy z przecinkami
Krzysztof - 23-06-2006 00:10
[MySQL] Problemy z przecinkami
Witam Mam problem. :( Baza danych MySQL 4.0.18-nt obslugujaca program ksiegowy. Po wprowadzeniu danych z dokladnoscia do dwoch miejsc po przecinku okazuje sie ze w bazie danych znajduje się wartosc zaokraglona.
CREATE TABLE `dokumenty` ( (...) `WARTOSC` float default NULL, (...) ) TYPE=MyISAM;
INSERT INTO DOKUMENTY ( (....) WARTOSC (...) ) VALUES (
(...) 8622229.26, (....) );
Wykonało się bezbłędnie (specjalnie wstawiłem dużą liczbę). A w bazie danych mozna zobaczyc select wartosc from dokumenty 2222870 25869,3 - inne inserty z przecinkami 25869,4 869,26
Oznacza to ze pole typu float moze przechowac tylko 7 cyfr. http://dev.mysql.com/doc/refman/4.1/...-overview.html A single-precision floating-point number is accurate to approximately 7 decimal places.
Mamy typ DOUBLE... A double-precision floating-point number is accurate to approximately 15 decimal places
Mysle, ze rowniez tu wystepuje identyczny problem, chociaz rzadziej (liczby 15 cyfrowe). Np. jest bardzo prawdopodobne, że w przeciągu następnych lat pojawi się taka duża operacja.
Dlaczego nie pojawia sie blad zakresu przy insercie ? Jak zapobiegacie takim przeklamaniom danych ? Czy przy każdym insercie mierzycie dlugosc liczby ?
Wolalbym, zeby baza danych wyrzucila blad. Tym bardziej, że takie znikanie małych i dużych cyferek jest nie do przyjęcia w księgowości.
Pozdrawiam Krzysztof
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 24-06-2006 00:09
Krzysztof wrote: > Użytkownik "Rafal sxat" <gonzak@op.pl> napisał w wiadomości > news:D17C7FC9A03C4C079B63C02E7D768F79@sxat... >>> Wolalbym, zeby baza danych wyrzucila blad. Tym bardziej, że takie >>> znikanie małych i dużych cyferek jest nie do przyjęcia w księgowości. >>> >> moze typ decimal pomoze .... > > > Na szybkiego pomoglo zmiana typu na DOUBLE nastepny prog z bledami jest juz > bardzo wysoko - niby 999 miliardów jeżeli dobrze licze. > 123' 456' 789' 012.45 > > Nie tyle chodzi o zdefiniowanie wiekszej dlugosci cyftry co uniemozliwienie > wprowadzenia bledu w programie. > Dzis moge sobie wyobrazic ze w bazie nie powinien znalezc sie zapis o > dlugosci wiekszej niz 17 cyfr... > Zycie moze pokazac co innego, zastosowanie bazy z czasem ewoluuje i moze sie > okazac ze nie wystarczy 17 cyfr. > Tak naprawde problem polega na tym ze baza zostala zaprojektowana i > stworzona na podstawie analizy tego co do tej pory mialo miejsce - czyli > blad projektowy nie przewidujacy nietypowego i skokowego rozwoju. > Jak zastosuje typ (dowolnie-ilu) cyfrowy to za pare lat moze sie okazac ze > popelnilem identyczny blad. > > Takie cos zostaje wykryte dopiero po jakims czasie, a operacje zostaly juz > rozksiegowane, podatki poplacone, .... itp. > > Chodzi mi o znalezienie dobrego sposobu zabezpieczenia przed przepelnieniem > takiej pozycji. > Bede musial parsowac i podliczac dlugosci kazdej zapisywanej liczby w bazie > przy insertach..... duuuzo grzebania w kodach zrodlowych. > > Chyba ze ktos ma lepszy pomysl. > Stad moje pytanie w jaki sposob sobie radzicie z tym problemem.
Po pierwsze, zamień double na decimal (choć w 4.0 to chyba nie ma znaczenia). Po drugie zajrzyj do dokumentacji mysql i na tej podstawie napisz własną, w której napiszesz jak wielkie kwoty Twój program obsługuje. I wtedy przestaje to być Twój problem.
-- P.M.
Marcin Wasilewski - 28-06-2006 00:08
Użytkownik "Krzysztof" <piornik@friko3.onet.pl> napisał w wiadomości news:e7e78u$278q$1@node1.news.atman.pl... > Witam > Mam problem. :( > Baza danych MySQL 4.0.18-nt obslugujaca program ksiegowy. > Po wprowadzeniu danych z dokladnoscia do dwoch miejsc po przecinku okazuje > sie ze w bazie danych znajduje się wartosc zaokraglona.
Ja po przejściach związanych z liczbami zmiennoprzecinkowymi, gdzie pojawiały mi się po sformatowaniu ciągu do 2 znaków po przecinku np. -0,00, które w rzecziwstości było liczbą o wartości -0,0000000000023, obecnie wszystkie kwoty w polach decimal i finał. PHP ma bibliotekę do obsługi takich liczb: bcadd, bcsub, bcdiv itd., więc nie ma problemu z obsługą tego. Wszystko jest łatwe, proste i przyjemne. A co najważniejsze, to się problemy z zaokrągleniami skończyły.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
zanotowane.pldoc.pisz.plpdf.pisz.plnatalia97.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|