Сравнение чисел с плавающей точкой

$x = 8 - 6.4; // which is equal to 1.6
$y = 1.6;
var_dump($x == $y); // is not true

PHP считает, что 1.6 (исходя из разницы) не равен 1.6. Чтобы заставить это работать, используйте round ()

var_dump(round($x, 2) == round($y, 2)); // this is true

 
Это происходит, вероятно, потому что $ x на самом деле не 1.6, а 1.599999 .. и var_dump показывает его как 1.6.
false
$a = 8 - 6.4;
$b = 1.6;
$c = $a == $b;
// Способ 1: округляем в большую сторону до 2х знаков после запятой и сравниваем -> true
$aa = round($a, 2);
$bb = round($a, 2);
$cc = $aa == $bb;
// Способ 2: получаем модуль разности и сравниваем с допустимым отклонение -> true
$ab = abs($a - $b);
$cab = $ab < 0.01; var_dump(compact('a', 'b', 'c', 'aa', 'bb', 'cc', 'ab', 'cab')); /** * array (size=8) * 'a' => float 1.6
* 'b' => float 1.6
* 'c' => boolean false
* 'aa' => float 1.6
* 'bb' => float 1.6
* 'cc' => boolean true
* 'ab' => float 4.4408920985006E-16
* 'cab' => boolean true
*/

Posted in PHP

Leave a Reply

Ваш адрес email не будет опубликован.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>