ďťż
 
[MySQL] Problemy z przecinkami ďťż
 
[MySQL] Problemy z przecinkami
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • natalia97.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com