Сравняване на float стойности в PHP

Никога не разчитайте на обикновеното сравняване когато сравнявате дроби. Това долу може и да не работи правилно и може и да изведе ‘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/

https://docstore.mik.ua/orelly/webprog/pcook/ch02_03.htm

https://www.php.net/manual/en/language.types.float.php

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *