var_dump(abs($onethird + $fivethirds - $half + $threehalf) < 0.00001);
vedi: http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm anche: http://docs.sun.com/source/806-3568/ncg_goldberg.html
Questo è vero in tutti i linguaggi di programmazione.
Non sono ancora arrivato in nessuna lingua dove ciò sia fatto automaticamente quando i programmatori vogliono l'uguaglianza dei float. Qualcuno dovrebbe venire con un nuovo operatore, forse = ~ = per l'uguaglianza galleggiante che farebbe automaticamente il confronto delle diff con Epsilon:
if ($float1 =~= $float2) {...
E 'fastidioso che ogni anno, da quando mi sono laureato, nel 2000, in questo periodo dell'anno alcuni novizi porranno questa domanda su alcuni newsgroup, forum o mailing list. Proprio il mese scorso ho risposto a questa domanda su comp.lang.tcl. E non sono solo i neofiti, due mesi fa ho dovuto spiegarlo al mio collega che ha sviluppato software da oltre 5 anni chiedendomi perché il suo codice Perl non funziona.
Questa è la natura dei numeri in virgola mobile in generale, quindi cosa ha a che fare con lo standard IEEE 754? –
PHP è scritto in C e quindi ottiene il supporto FP da esso, e la maggior parte dei runtime utilizza IEEE 754. Inoltre, IEEE 854 utilizza una radix variabile e quindi può supportare più precisione per alcuni numeri al costo di una certa velocità di elaborazione quando calcolando con loro. –
È la natura dei numeri in virgola mobile in generale. Il valore di epsilon (qui 0,000000001) dipende dal numero di bit che rappresentano il float. – slebetman