Floatval() в PHP?

Заранее извиняюсь за глупый вопрос, но пожалуйста, поясните почему происходит вот такая вещь:

<?php

 
// Задаём сразу значение переменных.
// В оригинале они считываются из файла, поэтому они представлены строками.
$a = '895.8858';
$b = '161.2595';
$sum = '1057.1453';

 
// Преобразуем в дробные значения, используя floatval();
$a = floatval($a);
$b = floatval($b);
$sum = floatval($sum);

 
// Складываем $a и $b и сравниваем с известной ранее суммой. Если не равны, выводим TRUE.
if ($sum != ($a + $b)) echo 'TRUE';

 
?>



Вопрос: почему сумма $a + $b не равна $sum, т.е. скрипт выведет TRUE;
  • Вопрос задан
  • 4744 просмотра
Решения вопроса 1
taliban
@taliban
php программист
Вообще в теории echo $a + $b даст ответ на вопрос, а если быть конкретней то:
0.1 + 0.7 === 0.8 // false
почему?
ответ не очевиден но: 0.1 + 0.7 = 0.7999999999999999
Ваша арифметика из той же степени — числа с плавающей точной не точны, округляйте до пары знаков после замятой с помошью number_format тогда будет все работать правильно
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@TimTowdy
Потому что IEEE 754
Очевидно, что при хранении чисел в двоичной системе, абсолютно точно можно хранить только те дробные числа, которые состоят из степеней двойки. Остальные числа хранятся с точностью до машинной эпсилон.
Ответ написан
Комментировать
Dunadan
@Dunadan
if ($sum != (float)($a + $b)) — нужно приводить к числу с плавающей точкой для сравнения.
Ответ написан
@agul
Вопрос: почему сумма $a + $b не равна $sum, т.е. скрипт выведет TRUE

Наверное я вопрос не понял, иначе ответ очевиден :)
Ответ написан
hayk
@hayk
Потому что у вас тип переменных float. Попробуйте в PHP найти разность между $sum и $a + $b. Как вариант — сравнивайте их как строки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы