Spesso si pensa che PHP sia privo di tipi di dato e che le sue variabili siano dei calderoni informi in cui mettere di tutto, ma non è così.

In questo caso stai utilizzando implicitamente il tipo float o double di PHP in cui è normale la perdita d'informazione. Stiamo parlando di numeri in virgola mobile rappresentati tramite codifica IEEE754. Non dimentichiamo che i numeri reali tra 0 e 1 sono infiniti, pertanto è ovvio che non sia possibile rappresentarli tutti come sequenza binaria a 64 bit pur avendo una buona approssimazione.

Float o Double

o leggi il warning di php.net