Intereting Posts
перебирать результаты $ _GET Расширение PHP Smarty Singleton Class Проблемы с синхронизацией сети, вызывающие PHP, «не удалось открыть поток: нет такого файла или каталога» Запись всех запросов и ответов на мыло в PHP Как я могу заставить PHP-скрипт запускать сценарий оболочки как root? Получение измененной модели обхода дерева предзаказов (вложенный набор) в <ul> Установка Mongodb с лампой на Ubuntu (Linux) как получить переменные сеанса с использованием идентификатора сеанса Laravel Request :: all () не следует называть статически Как добавить / установить изображения на шаблоне PHPOffice / PHPWord? javascript backspace по умолчанию проблема … Возврат страницы Php mysqi bind_param Число переменных не соответствует количеству параметров в подготовленном операторе отправлять напоминания электронной почты с php и mysql БЕЗ cron-job? Как получить последний запрос выполнения в CakePHP 3.2? Загружать видео и извлекать миниатюру с помощью Amazon s3

Проблема с поплавками! (в PHP)

Что случилось с php-поплавками?

$v = 5.2 * 3; if($v==15.6) { echo 'Everything is fine =)'; } else { echo 'Okay something is wrong :S'; var_dump($v); // float 15.6 } 

Проверьте это тоже:

 $v = 5.2 * 3; if($v>15.6 AND $v<15.60000000001) { echo 'We are doomed :S'; var_dump($v); // float 15.6 } else { echo 'Everything is fine =)'; } 

Наверное, это связано с внутренним представлением или каким-то неясным материалом низкого уровня? Если это так, как мне обойти эту проблему? Что-нибудь еще, что я должен знать, прежде чем использовать это для расчета транзакций на реальные деньги?

Related of "Проблема с поплавками! (в PHP)"

Я уверен, что это дубликат, поэтому я делаю это CW

 $v = 5.2 * 3; if (bccomp($v, 15.6) === 0) { echo 'Everything is fine =)'; } else { echo 'Okay something is wrong :S'; var_dump($v); // float 15.6 } 

даст «Все нормально»)

Это имеет отношение к внутреннему представлению действительно :). Никогда не сравнивайте значения float. Я думаю, что будут существовать классы / модули php, которые работают вокруг этой проблемы, но вы также можете хранить свои денежные значения в виде целых чисел и умножать их на 100 . Перед отображением вы можете разделить их снова 🙂

Это связано с плаваниями в целом и не ограничивается PHP.

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

 if(abs($v - 15.6) < 0.0001) { // Yey :) } 

При использовании точных значений вы можете столкнуться с множеством проблем.

значение, которое вы получаете, составляет 15.600000000000001, и оно отличается от 15.6, эта тема широко обсуждалась, вы можете взглянуть на эти темы:

  • Нечеткие числа с добавлением микросов и с плавающей запятой в PHP
  • Сравнение поплавков в php

HTH, С уважением

На странице PHP на поплавках есть предупреждение против сравнения для равенства, а также ссылки на эту страницу, которая ссылается на bccomp .

Если вам действительно нужно сравнить проверку поплавков, чтобы быть в пределах допустимого отклонения вместо точного соответствия, например

 $DEVIATION = 0.0001; if(abs($v-15.6)<$DEVIATION) ... 
 $v = 5.2 * 3; if((string)$v == "15.6") { print "yes"; } 

Всегда хорошо проверять PHP-сайт, так как большинство разработчиков сталкиваются с проблемами до PHP.net Floating Point Number, этот комментарий показывает функцию сравнения поплавков.

 <?php function IsFloatEqual($x,$y,$precision=0.0000001) { return ($x+$precision >= $y) && ($x-$precision <= $y); } ?> 

Просто небольшое дополнение для любого вида:

функции BC * – единственный верный способ работы с float в PHP!