ugrás a tartalomhoz

FLOAT típusú változóval számítás

mokat · 2009. Már. 6. (P), 12.12
Sziasztok,

ismét kis help kéne: mysql-ből származó float típusú mezőértékekkel végzek műveleteket (összeadást és kivonást). Majd egy másik mezőbe eltárolom az eredményt, ezt változóba teszem és megjelenítem a weblapon.

hiba(?): ha az egyik ilyen művelet után ha 0 értéke lesz a mezőnek, akkor a weblapon és az adatbázisban egy ilyen formátum jelenik meg: 45632e-8 (vagy ilyesmi, a lényeg hogy e-adosban)
Ezt hogy lehet kikerülni/kijavítani?

Köszi előre is a segítséget!
 
1

0 értéke lesz

Poetro · 2009. Már. 6. (P), 13.18
Ha 0 értéke lesz, akkor hogyan tárolsz el mégis 45632e-8-at?
Ugyanis
print 45632e-8;
0.00045632
Azaz messze nem 0. Ha mégis 0-t szeretnél adatbázisba írni, akkor használj valamilyen kerekítő függvényt, pl ROUND amivel akár tizedesjegyekre is tudsz kerekíteni.

mysql> SELECT 45632e-8, ROUND(45632e-8, 4), ROUND(45632e-8, 3);
+------------+--------------------+--------------------+
| 45632e-8   | ROUND(45632e-8, 4) | ROUND(45632e-8, 3) |
+------------+--------------------+--------------------+
| 0.00045632 |             0.0005 |              0.000 |
+------------+--------------------+--------------------+
1 row in set (0.00 sec)
2

most kézzel is kiszámoltam

mokat · 2009. Már. 6. (P), 13.53
egyik juzernek a pontszámát kiszámoltam kézzel, mert az adatbázisban ez szerepelt:
-0,0499999999

kézzel számolva: -0,05

gondolom a round() dolog segítene, de nem értem miért lehet ez... minden float amivel dolgozom :|
3

Bináris számítás

Poetro · 2009. Már. 6. (P), 14.19
Gondolom a bináris számítás alapjait, és azon belül a lebegőpontos számítást azért megtanultad az egyetemen / középiskolában. Lásd például a Wikipédia idevágó cikkét
5

Pontos(abb) számítások

Poetro · 2009. Már. 6. (P), 14.52
Ha pontosabb számításokat szeretnél végezni PHP + MySQL kombinációban, akkor:
  • PHP oldalon a BCMath függvényeket kell használni, ami stringként tárolja a számokat, és speciális függvényeket kell meghívni a matematikai műveletek elvégzéséhez: pl. bcadd, bcsub
  • MySQL oldalon valamilyen szöveg típusú mezőt kell választanod. Ha MySQL-ben is számként akarod kezelni, akkor DECIMAL vagy NUMERIC típusú mezőt használj, bár ezek pontossága "csak" 64 számjegyű, de jóval kevesebb helyet foglalnak.

Ha nem PHPt használsz, minden valószínűség szerint a BCMath könyvtárnak megfelelő létezik az adott nyelvhez is.
4

PHP és a float

Roberto · 2009. Már. 6. (P), 14.30
A lényeg az, hogy a float úgy kb. 14 tizedesjegyig pontos. Ezt elég könnyű átlépni, ha sok számítás van a kódban(osztogatsz, összeadsz/kivonsz), és így hibát halmozni.

Ha nagy pontosság szükséges, akkor érdemes inkább string alapú aritmetikával számolni.