Что случилось с 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 =)'; }
Наверное, это связано с внутренним представлением или каким-то неясным материалом низкого уровня? Если это так, как мне обойти эту проблему? Что-нибудь еще, что я должен знать, прежде чем использовать это для расчета транзакций на реальные деньги?
Я уверен, что это дубликат, поэтому я делаю это 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, эта тема широко обсуждалась, вы можете взглянуть на эти темы:
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!