2015-08-10 1 views
0

Я работал над кодом, и я не мог понять, какой странный результат я получал.PHP function 'pow' weird result

<?php 

    $a = 0.01; 
    $p = pow(0.1, 2); // result: 0.01 

    if($a < $p){ 
     echo "true"; 
    } 

?> 

В результате этого условия всегда «истина» в то время как обе переменные имеют одинаковое значение, но результат приходит из pow меняется что-то внутри. Похоже, я не смог бы положиться на эту функцию. Кто-нибудь, пожалуйста, помогите мне понять это?

+0

если вы меняете условия, это будет неверно. – Noman

ответ

2

его из поплавковой неточностью, взглянуть на отвеченный вопрос, упомянутого в комментарии по b0s3

Читать красный предупреждающий первый http://www.php.net/manual/en/language.types.float.php. Вы никогда не должны сравнить floats для равенства. Вы должны использовать технику epsilon.

Например:

if (abs($a-$b) < EPSILON) { … } где EPSILON постоянная, представляющая очень небольшое число (вы должны определить его)

https://stackoverflow.com/a/3149007/4998045

так что вы можете доверять pow функцию, но вы не можете доверять float comparsion

+0

это хорошо выглядит. В моем случае он работает, имея значение EPSILON 0.000000000000000001, если я уменьшу еще один ноль, это не даст мне правильный результат. – Arfeen

+0

, но обратите внимание, что с различными операциями с поплавком возникает различная неточность, поэтому разумно выбирайте значение EPSILON, потому что слишком маленькие значения не должны работать в других случаях –

1

PHP Docs сказал:

основание, возведенное в степень ехр. Если оба аргумента являются целыми неотрицательными, и результат может быть представлен как целое число, результат будет возвращен с целым типом, иначе он будет возвращен как float.

Возможно, вам нужно преобразовать все в int или все, чтобы плавать.

if((float)$a < (float)$p){ 
    echo "true"; 
} 

Смотрите его запустить:

http://phpfiddle.org/main/code/2hv5-n2fw

+0

true, но здесь это не проблема –

+0

@Pepo_rasta вот в чем проблема. OP думает, что функция 'pow' производит внутренние изменения, и это правда. Функция возвращает значение с типом в соответствии с ним. Если вы сравниваете ints с float, проблема в том, что OP сказал. –

+1

Нет, вы ошибаетесь в своем чуваке, OP используя 'pow (0.1,2);' и вы используете 'pow (0.01, 2);' которые возвращают 0.001, сравнение между int и float работает немного хорошо ... ps : как вы думаете, что 0.01 возвращается как int? –