Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Upotreba DECIMAL tipa

[es] :: MySQL :: Upotreba DECIMAL tipa

[ Pregleda: 2916 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Miroslav Ćurčić
ex mVeliki
Novi Sad

Član broj: 19034
Poruke: 1118
*.adsl.beotel.net.



+19 Profil

icon Upotreba DECIMAL tipa16.12.2008. u 16:38 - pre 187 meseci
Kolega Kecman je u jednom odgovoru nagovestio kako DECIMAL tip podataka treba izbegavati.

Dali je zaista tako?

Moje zapažanje je da je u odnosu na FLOAT tip ovde sigurno poređenje vrednosti pa sam ga zato koristio.

Recimo da sam ga postavio kao (10,4) i vršio SELECT upoređujući ga s nekom drugim poljem.
Dok sam isprobavao kao FLOAT dešavalo mi se da ne prepozna neke redove jer se nisu poklapale one najsitinje decimale.
Ovako s DECIMAL sam ga primorao da zaokruži na 4 decimale pa je pretraga uvek bila tačna.

Ima li možda način da FLOAT polje ograničim po broju decimala ?
Pričam o relativnoj dodeli vrednosti, znači: UPDATE ..... SET `IznosPoreza`=`Cena`*`Porez` .....
"The quieter you become, the more you are able to hear."
Blog | PowerCMS
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.xdsl.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Upotreba DECIMAL tipa16.12.2008. u 17:17 - pre 187 meseci
nemoj tako zvanicno, osecam se kao da imam 1000 godina :)

pocecu sa "potpuno si u pravu za to sto si napisao"!

da razjasnim, posto nisam hteo da idem u dubinu tamo na drugoj temi ...

primer
create table cena (proizvod_id bigint, cena float);

ako nam je cena decimal (bez (m,n)) onda nam je cena ceo broj sto nam uglavnom ne radi posao, dakle ako trosimo decimal za cenu bice limitiran nekom vrednoscu .. na primer cena decimal(10,3).

Sta je benefit ovoga:
1. mysql ce zaokruziti unetu vrednost na 3 decimale
2. ako trazimo proizvod sa cenom 10.078 nacicemo ga lako

Sta je mana:
1. mysql ce zaokruziti vrednost na 3 decimale

mene su pre neko jutro zvali iz banke da provere da li 0.01$ idu u troskove ili u uslugu posto je invoice zaokruzio na 2 decimale i u totalu je bilo 0.01 vise nego u zbiru ove dve kolone (u poljima je vise decimala no oo je prikazao zaokruzeno na 2 decimale i tako izvezao u pdf).

Ovo moze da bude problem.

E sad, ako nam je potrebno WHERE f1 = 0.003 decimal je "jedini" tip koji ce to odraditi kako treba posto sa float i double to, kako si naveo, moze da pravi problem.
Ono sto je iskustveno je da ti takav WHERE skoro nikad ne treba .. obicno radis agregacije ( SUM(f1), AVG(f1)...) ili > f1 / < f1 .. retko kad == .. e sad, ako ti treba == decimal je ok

Citat:

Ima li možda način da FLOAT polje ograničim po broju decimala ?
Pričam o relativnoj dodeli vrednosti, znači: UPDATE ..... SET `IznosPoreza`=`Cena`*`Porez` ....


yup
Code:

mysql> create table t10 (x float(10,2), y float(10,2), z float(10,2));
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> insert into t10 values (0,0.18,123.12345);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t10;
+------+------+--------+
| x    | y    | z      |
+------+------+--------+
| 0.00 | 0.18 | 123.12 | 
+------+------+--------+
1 row in set (0.00 sec)

mysql> 
mysql> update t10 set x=y*z;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t10;
+-------+------+--------+
| x     | y    | z      |
+-------+------+--------+
| 22.16 | 0.18 | 123.12 | 
+-------+------+--------+
1 row in set (0.00 sec)



I isto to bez (m,n)
Code:

mysql> drop table t10;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> create table t10 (x float, y float, z float);
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> insert into t10 values (0,0.18,123.12345);
Query OK, 1 row affected (0.00 sec)

mysql> update t10 set x=y*z;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t10;
+---------+------+---------+
| x       | y    | z       |
+---------+------+---------+
| 22.1622 | 0.18 | 123.123 | 
+---------+------+---------+
1 row in set (0.00 sec)



dakle sa float/double mozes da imas odredjenu tacnost (32/64bit) ili zaokruzivanje, sa dec imas samo zaokruzivanje ... samim tim, moj licni (to nije zvanicni neki stav) stav je izbegavanje decimal tipa :)

ono sto se postavlja kao pitanje je, da li ti mozes da predas godisnji izvestaj koji je ceo zaokruzen na 2 decimale? kao sto rekoh, mene zvali iz banke zbog 0.01$ dal da ga stave na 305 ili 343 sifru (kao da ima neke razlike).

sto se poredjenja tice, meni licno za 10+ godina rada sa bazama nikad nije trebalo da jednacim dva decimalna broja .. uglavnom sam ih sabirao, vadio prosek trazio veci ili manji ... nikad mi nije trebalo da nadjem artikal sa cenom 0.0123, uvek je bilo "nadji artikle skuplje od 12.12 ili jeftinije od 12.95" ...


 
Odgovor na temu

Miroslav Ćurčić
ex mVeliki
Novi Sad

Član broj: 19034
Poruke: 1118
*.adsl.beotel.net.



+19 Profil

icon Re: Upotreba DECIMAL tipa16.12.2008. u 18:31 - pre 187 meseci
Nije zvanično,
ali stavio si zvučan potpis a ja uvek poštujem stručnjake.

Nisam znao za konstrukciju FLOAT(10,2), tj da FLOAT uopšte prihvata zagradu i vrednosti.
Hvala za info.
"The quieter you become, the more you are able to hear."
Blog | PowerCMS
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.xdsl.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Upotreba DECIMAL tipa16.12.2008. u 18:57 - pre 187 meseci
ma .. "kolega kecman", "g. kecman" ... to je moj cale :) .. nikad se ja na to necu naviknuti ..

sto se tice float-a:

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html
Citat:

MySQL allows a non-standard syntax: FLOAT(M,D) or REAL(M,D) or DOUBLE PRECISION(M,D). Here, “(M,D)” means than values can be stored with up to M digits in total, of which D digits may be after the decimal point. For example, a column defined as FLOAT(7,4) will look like -999.9999 when displayed. MySQL performs rounding when storing values, so if you insert 999.00009 into a FLOAT(7,4) column, the approximate result is 999.0001.


zgodno je procitati i http://dev.mysql.com/doc/refman/5.1/en/precision-math.html

Generalno, ako ti treba jednacenje, decimal je "preporucen" posto je striktan, float i real su ne standardni u striktnoj varijanti. Ja decimal organski ne podnosim posto je u svemu zivom exception, od toga kako se ponasa sa auto_increment-om preko svega ostalog... no, ima svoju upotrebnu vrednost, a *nikad* mi licno nije trebalo da jednacim decimalni broj :)
 
Odgovor na temu

[es] :: MySQL :: Upotreba DECIMAL tipa

[ Pregleda: 2916 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.