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" ...