Forum und email

Lebegőpontos számok

A lebegőpontos számok ("float", "valós szám") az alábbi szintaxisok bármelyikével hozhatóak létre:

<?php
$a 
1.234
$b 1.2e3
$c 7E-10;
?>
Formálisan:
LNUM          [0-9]+
DNUM          ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM ( ({LNUM} | {DNUM}) [eE][+-]? {LNUM})
A lebegőpontos számok mérete platformfüggő, de a maximális érték körülbelül 1.8e308, durván 14 tizedesjegy pontossággal (64 bites IEEE formátum).

Warning

Lebegőpontos számok pontossága

Elég gyakran előfordul, hogy egyszerű decimális törtek, mint a 0.1 és a 0.7 nem konvertálhatóak pontosan bináris megfelelőikre kis veszteség nélkül. Ez zavaró eredményekhez vezethet, például floor((0.1+0.7)*10) tipikusan 7 értékkel tér vissza, az elvárt 8 helyett, a belső ábrázolás miatt, ami valójában 7.9999999999....

Ez azzal a ténnyel van kapcsolatban, hogy lehetetlen megjeleníteni néhány törtet véges számú decimálisan számjeggyel. Például 1/3 decimálisan 0.3333333. . . értékké válik.

Ezért soha ne bízz meg a törtszámok eredményeiben az utolsó jegyig, és soha se hasoníts össze két lebegőpontos számot pontos egyenlőségre. Ha nagyobb pontosságú számokra van szükséges, használd a tetszőleges pontosságú matematikai függvényeket vagy a gmp függvényeket.

Konverzió float-ra

A stringek float-ra történő konvertálásáról a Stringek átalakítása számmá című részben találsz információt. Más típusú értékek esetén a konverzió pontosan úgy történik, mintha előbb integer-ré konvertálódna, majd az eredmény float-ra. További információért lásd még a Egész értékké alakítás című részt. A PHP 5-ös verziójától ha objektumot float-tá alakítasz, figyelmeztetés (notice) szintű hibajelzés keletkezik.