Никога не разчитайте на обикновеното сравняване когато сравнявате дроби. Това долу може и да не работи правилно и може и да изведе ‘Not equal’ и по принцип зависи от платформата, демек от хардуера. Как точно, не знам.
$a = 0.3; $b = 0.4; $c = 0.7; if (($a + $b) === $c) { echo 'Equal'; } else { echo 'Not equal'; }
In PHP, the size of a floating values is platform-dependent. Due to internal representation of floating point numbers, there might be unexpected output while performing or testing floating point values for equality.
Дължи се на една особеност на компютрите – има винаги някаква малка загуба на точност когато съхраняват дроби (floating point numbers) в паметта си. И това идва при представянето на даденото число в двоична бройна система.
Например, десетичното 0.5 всъщност се съхранява двоично в паметта като 0.49999999… според стандарта IEEE 754 double precision. Това е неизбежно, защото когато превърнем десетичното 0.5 в двоично число, дори и IEEE 754 double precision не стига за събиране на всички „0“ и „1“ и от там идва загубата на точност, защото неизбежно се налага да „отрежем“ числото от някъде, за да го съберем.
Десетично 0.5 може да е ОК, но двоичното 0.5 може и да не е съвсем 0.5
Литература:
https://www.geeksforgeeks.org/comparing-float-value-in-php/