=?iso-8859-2?Q?Dok=B3adno=B6=E6_MySQL-a?=
totyl - 21-05-2006 00:23
=?iso-8859-2?Q?Dok=B3adno=B6=E6_MySQL-a?=
Popatrzcie na ten przykład:
mysql> select * from blah; +-----------------------------------+ | value | +-----------------------------------+ | 10.00000000000000000000000000000 | | 10.00000000000000000000000000000 | | 10.00000000000000000000000000000 | | -40.00000000000000000000000000000 | | 10.00155900000000000000000000000 | +-----------------------------------+ 5 rows in set (0.00 sec)
mysql> select sum(value) from blah; +---------------------------------+ | sum(value) | +---------------------------------+ | 0.00155900000000031013769330457 | +---------------------------------+ 1 row in set (0.00 sec)
mysql> show columns from blah; +-------------+----------------+------+-----+---------------------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------------+------+-----+---------------------------------+----------------+ | value | decimal(32,29) | | | 0.00000000000000000000000000000 | | +-------------+----------------+------+-----+---------------------------------+----------------+ 1 rows in set (0.00 sec)
mysql>
Skąd ta dziwna wartość sum(value)??? Czy nie może być prawidłowo? Przecież to tylko sumowanie! O czym nie wiem? :)
Pozdrówko
totyl
Xneme - 22-05-2006 00:01
totyl napisał(a): > Popatrzcie na ten przykład: > > mysql> select * from blah; > +-----------------------------------+ > | value | > +-----------------------------------+ > | 10.00000000000000000000000000000 | > | 10.00000000000000000000000000000 | > | 10.00000000000000000000000000000 | > | -40.00000000000000000000000000000 | > | 10.00155900000000000000000000000 | > +-----------------------------------+ > 5 rows in set (0.00 sec) > > mysql> select sum(value) from blah; > +---------------------------------+ > | sum(value) | > +---------------------------------+ > | 0.00155900000000031013769330457 | > +---------------------------------+ > 1 row in set (0.00 sec) > > mysql> show columns from blah; > +-------------+----------------+------+-----+---------------------------------+----------------+ > > | Field | Type | Null | Key | Default | Extra | > +-------------+----------------+------+-----+---------------------------------+----------------+ > > | value | decimal(32,29) | | | > 0.00000000000000000000000000000 | | > +-------------+----------------+------+-----+---------------------------------+----------------+ > > 1 rows in set (0.00 sec) > > mysql> > > Skąd ta dziwna wartość sum(value)??? Czy nie może być prawidłowo? > Przecież to tylko sumowanie! > O czym nie wiem? :) > > Pozdrówko > > totyl moze zglosc to do developwerow mysql :), ale cos mi swita czemu tak jest ale jak mi zaswita to ci napisze bo teraz jakos nei moge sobie przypomniec :)
Xneme - 22-05-2006 00:01
totyl napisał(a): > Popatrzcie na ten przykład: > > mysql> select * from blah; > +-----------------------------------+ > | value | > +-----------------------------------+ > | 10.00000000000000000000000000000 | > | 10.00000000000000000000000000000 | > | 10.00000000000000000000000000000 | > | -40.00000000000000000000000000000 | > | 10.00155900000000000000000000000 | > +-----------------------------------+ > 5 rows in set (0.00 sec) > > mysql> select sum(value) from blah; > +---------------------------------+ > | sum(value) | > +---------------------------------+ > | 0.00155900000000031013769330457 | > +---------------------------------+ > 1 row in set (0.00 sec) > > mysql> show columns from blah; > +-------------+----------------+------+-----+---------------------------------+----------------+ > > | Field | Type | Null | Key | Default | Extra | > +-------------+----------------+------+-----+---------------------------------+----------------+ > > | value | decimal(32,29) | | | > 0.00000000000000000000000000000 | | > +-------------+----------------+------+-----+---------------------------------+----------------+ > > 1 rows in set (0.00 sec) > > mysql> > > Skąd ta dziwna wartość sum(value)??? Czy nie może być prawidłowo? > Przecież to tylko sumowanie! > O czym nie wiem? :) > > Pozdrówko > > totyl
u mnie wynik tego sdumowania jest ten sam 0.00155900000000031013769330457
cos mi sie zdaje ze kiedys na programowaniu w C byla mowa o takich przypadkach ale nie moge sobie przypomniec
eLeM - 22-05-2006 00:02
totyl napisał(a): > Popatrzcie na ten przykład: > > mysql> select * from blah; > +-----------------------------------+ > | value | > +-----------------------------------+ > | 10.00000000000000000000000000000 | > | 10.00000000000000000000000000000 | > | 10.00000000000000000000000000000 | > | -40.00000000000000000000000000000 | > | 10.00155900000000000000000000000 | > +-----------------------------------+ > 5 rows in set (0.00 sec) > > mysql> select sum(value) from blah; > +---------------------------------+ > | sum(value) | > +---------------------------------+ > | 0.00155900000000031013769330457 | > +---------------------------------+ > 1 row in set (0.00 sec) > > mysql> show columns from blah; > +-------------+----------------+------+-----+---------------------------------+----------------+ > > | Field | Type | Null | Key | Default | Extra | > +-------------+----------------+------+-----+---------------------------------+----------------+ > > | value | decimal(32,29) | | | > 0.00000000000000000000000000000 | | > +-------------+----------------+------+-----+---------------------------------+----------------+ > > 1 rows in set (0.00 sec) > > mysql> > > Skąd ta dziwna wartość sum(value)??? Czy nie może być prawidłowo? > Przecież to tylko sumowanie! > O czym nie wiem? :) > > Pozdrówko > > totyl --------------------------------------------------------------------------
Jeśli się nie myle to (a może się myle - głowy nie dam) to chodzi o problem z operacjami na liczbach miennoprzecinkowych. Przy dużych liczbach jest problem z poprawnością obliczeń takich liczb gdyż na którymś tam miejscu po przecinku następują błędne obliczenia.
Pozdrawiam, eLeM
Kocureq - 22-05-2006 00:02
eLeM napisał(a): > Jeśli się nie myle to (a może się myle - głowy nie dam) to chodzi o > problem z operacjami na liczbach miennoprzecinkowych. Przy dużych > liczbach jest problem z poprawnością obliczeń takich liczb gdyż na > którymś tam miejscu po przecinku następują błędne obliczenia. Ale tu jest suma, cos nie tak.
Ten blad wystepuje np. wtedy:
10*0.1-1
Ale to wynika z tego ze 0.1 jest ulamkiem nieskonczonym w zapisie binarnym
A tutaj jesli raz ta liczba jest wyswietlana w dany sposob (czyli jest konwertowana z zapisu binarnego na dziesietny)
10.00155900000000000000000000000
i przeciez po sumowaniu nic sie w niej nie powinno zmienic, bo operacje sumowania sa dokonywane na czesciach calkowitych pzoostalych liczb, ktore to juz sa skionczone. ergo czesc ulamkowa tej liczby nie powinna sie zmienic w zapisie binarnym.
-- /\ /\ [ Jakub 'Kocureq' Anderwald ] /\ /\ =^;^= [ [nick][at][nick].com ] =^;^= / | [ GG# 1365999 ICQ# 31547220 ] | \ (___(|_|_| [ kocureq@jabber.org ] |_|_|)___)
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 22-05-2006 00:02
Kocureq wrote: > eLeM napisał(a): > >> Jeśli się nie myle to (a może się myle - głowy nie dam) to chodzi o >> problem z operacjami na liczbach miennoprzecinkowych. Przy dużych >> liczbach jest problem z poprawnością obliczeń takich liczb gdyż na >> którymś tam miejscu po przecinku następują błędne obliczenia. > > Ale tu jest suma, cos nie tak. > > Ten blad wystepuje np. wtedy: > > 10*0.1-1 > > Ale to wynika z tego ze 0.1 jest ulamkiem nieskonczonym w zapisie binarnym
Prawda, ale co z tego?
> A tutaj jesli raz ta liczba jest wyswietlana w dany sposob (czyli jest > konwertowana z zapisu binarnego na dziesietny) > > 10.00155900000000000000000000000 > > i przeciez po sumowaniu nic sie w niej nie powinno zmienic, bo operacje > sumowania sa dokonywane na czesciach calkowitych pzoostalych liczb, > ktore to juz sa skionczone. ergo czesc ulamkowa tej liczby nie powinna > sie zmienic w zapisie binarnym.
Ale zmyślasz....
mysql> select 10.01590000000000000000; +-------------------------+ | 10.01590000000000000000 | +-------------------------+ | 10.01590000000000024727 | +-------------------------+
Krótko mówiąc, 10.0159 nie da się dokładnie zapisać w binarnej reprezentacji liczby zmiennoprzecinkowej, więc jeśli będziemy wymagać większej dokładności wyjdzie szydło z worka.
A dlaczego mówimy o liczbach zmiennoprzecinkowych? Wystarczy przeczytać cały akapit z dokumentacji, w takim zaskakującym dla niektórych miejscu, jak opis typu DECIMAL. I tam wyraźnie pisze, że chociaż jest to typ stałoprzecinkowy, ma dokładność typu DOUBLE. I zapewne o to pytającemu chodzi.
-- P.M.
Kocureq - 22-05-2006 00:02
Paweł Matejski napisał(a): > Ale zmyślasz.... > mysql> select 10.01590000000000000000; > +-------------------------+ > | 10.01590000000000000000 | > +-------------------------+ > | 10.01590000000000024727 | > +-------------------------+
A, to ok :)
Skoro dokladny zapis binarny liczby dziesiętnej 10.01590000000000000000 wynosi 10.01590000000000024727 to moze byc.
Tylko dlaczego tutaj:
mysql> select * from blah; +-----------------------------------+ | value | +-----------------------------------+ | 10.00000000000000000000000000000 | | 10.00000000000000000000000000000 | | 10.00000000000000000000000000000 | | -40.00000000000000000000000000000 | | 10.00155900000000000000000000000 | +-----------------------------------+
wyswietlana jest liczba tak, jakby siedziala dokladnie w takiej postaci jak w dziesietnej?
-- /\ /\ [ Jakub 'Kocureq' Anderwald ] /\ /\ =^;^= [ [nick][at][nick].com ] =^;^= / | [ GG# 1365999 ICQ# 31547220 ] | \ (___(|_|_| [ kocureq@jabber.org ] |_|_|)___)
ethanak - 23-05-2006 00:24
Kocureq napisał(a): [...] > Tylko dlaczego tutaj: > > mysql> select * from blah; > +-----------------------------------+ > | value | > +-----------------------------------+ > | 10.00000000000000000000000000000 | > | 10.00000000000000000000000000000 | > | 10.00000000000000000000000000000 | > | -40.00000000000000000000000000000 | > | 10.00155900000000000000000000000 | > +-----------------------------------+ > > wyswietlana jest liczba tak, jakby siedziala dokladnie w takiej postaci > jak w dziesietnej? > A nie jest tak, że ta liczba jest zapisana w bazie jako decimal z odpowiednią dokładnością a dopiero jakiekolwiek operacje arytmetyczne przekształcają ją na double? SELECT raczej nie jest operacją arytmetyczną...
ethanak -- mailto=window.atob('ZXRoYW5ha0Bwb2xpcC5jb20='); /* Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie. To jest ewidentna bezczelność! S. Friedmann/J. Kofta */
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Gdzie MySQL 4.1, a gdzie 5.0?
[MS SQL] "set names" (mySQL) w MS SQL
oracle -> oracle lub oracle -> mysql replikacja - programy
[mysql 4.0] SELECT t1.id, t1.foo FROM t1 oraz COUNT t2 w jednym zapytaniu.
[MySQL] Zwrot tego, co pasuje i nie pasuje :-/
[pgsql] Dostosowanie składni MySQL 5.0 -> PGSQL 8.1
[mysql] galeria zdjec - numerowanie zdjec
[MySQL] Zapytanie z pliku , wynik do pliku
[mysql] CONCAT agregujący, ale nie GROUP_CONCAT()
mysql data 0000-00-00 na koniec
zanotowane.pldoc.pisz.plpdf.pisz.pllunadance.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 |
|