За последние 24 часа нас посетили 64480 программистов и 1745 роботов. Сейчас ищут 905 программистов ...

php путается в if else

Тема в разделе "PHP для новичков", создана пользователем Cyrius, 11 дек 2016.

  1. Cyrius

    Cyrius Активный пользователь

    С нами с:
    3 июл 2016
    Сообщения:
    98
    Симпатии:
    4
    Привет, пишу я значит код: если корень из числа извлекается - то извлекать, а если не извлекать - писать перед ним знак корня. Значит вот как у меня это написано:

    PHP:
    1. $D4 = 144;
    2. $DK4 = sqrt($D4);
    3.         if (!is_int($DK4)) {
    4. echo "√".$D4;
    5. }
    6. else {
    7. echo $DK4;
    8. }
    Как известно, корень из 144 = 12. А 12 - целое число. Следовательно он должен написать мне не √144, а 12. НО он пишет √144, и так кстати с любыми числами. В чем моя ошибка? Может я неправильно понял предназначение is_int() ?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    4 и 7 строка, переменные поменяйo_O
     
  3. Cyrius

    Cyrius Активный пользователь

    С нами с:
    3 июл 2016
    Сообщения:
    98
    Симпатии:
    4
    а где логика то:(, он мне выводит √12..
    --- Добавлено ---
    Насколько я перевожу этот код - если корень из 144 НЕ ЦЕЛОЕ - выводить √144 , иначе выводить 12.
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А кто вам сказал, что число 12.00000 целое с точки зрения машины? Обычное вещественное число.
    Перепиши так, к примеру:
    Код (PHP):
    1. <?php
    2. $D4 = 144;
    3. $DK4 = sqrt($D4);
    4.  
    5. if ($D4 != (int) $D4) {
    6. echo "√".$D4;
    7. }
    8. else {
    9. echo $DK4;
    10. }
    11.  
    12. ?>
     
  5. Cyrius

    Cyrius Активный пользователь

    С нами с:
    3 июл 2016
    Сообщения:
    98
    Симпатии:
    4
    Если 144 не равно integer от 144, может что-то добавить сюда надо? Ибо протестировав код, я увидел что ничего не поменялось..
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
  7. Cyrius

    Cyrius Активный пользователь

    С нами с:
    3 июл 2016
    Сообщения:
    98
    Симпатии:
    4
    Код работает к сожалению не так как нужно!!!
    Да, он извлекает корень из числа, НО он извлекает его из любого числа даже из того, из которого корень не извлекается, с таким же успехом я мог бы просто применить функцию sqrt()
    Чего я хочу добиться от своего кода:
    Если дано число, корень из которого извлекается - извлекаем.
    Если дано число, корень из которого не извлекается - не извлекаем, а пишем знак радикала + подкоренное выражение.
    Я думал задумка ясна.
     
  8. sevskeef

    sevskeef Новичок

    С нами с:
    11 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    Результатом извлечения корня всегда будет float число https://php.ru/manual/function.sqrt.html
    Поэтому проверка is_int и иже с ними не сработает. Можно, как вариант, поступить так: умножить полученный результат на 100-1xxx (какова нужна точность) и целое число результата на это же число (100 ... ) а затем вычесть одно из другого. Если получаем 0 - значит корень .... ну или очень близкое число, зависит от точности ...
    Надеюсь понятно объяснил
    Код (Text):
    1. $res = sqrt(x);
    2. $var_int = (int)$res * 1000000;
    3. $var_flt = $res*1000000;
    4. if( ($var_flt - $var_int) == 0 )
    5.       целое число
    6. else
    7.      не целое
    Кстати, вот только что пришло в голову, как второй вариант, это результат возвести в степень2 и сравнить с исходным числом. Если результат извлечения корня не целое число вы никогда не получите исходное число. Другое дело, что отличаться они будут также довольно "далеко".
    Например:
    корень из 10 = 3,1623 ... 3,1623*3,1623=10,0001
     
    #8 sevskeef, 11 дек 2016
    Последнее редактирование: 11 дек 2016
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Найдите разницу между результатом и целой частью результата. То есть величину дробной части. Если эта разница (по модулю) не больше заранее заданной точности, скажем 0.001, то считаем что получили целочисленный результат.
     
  10. sevskeef

    sevskeef Новичок

    С нами с:
    11 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    а я что написал?
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Чуток опечатался. Могли бы и заметить, если бы вникали в то, что предлагают, а не просто так запускали.
    Код (PHP):
    1. <?php
    2. $D4 = 144;
    3. $DK4 = sqrt($D4);
    4.  
    5. if ($DK4 != (int)($DK4)) {
    6. echo "√".$D4;
    7. }
    8. else {
    9. echo $DK4;
    10. }
    11.  
    12. ?>
    То, что @artoodetoo и @sevskeef предлагают - вариант точнее, конечно, но вроде и этот работает
     
  12. sevskeef

    sevskeef Новичок

    С нами с:
    11 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    Код (Text):
    1. if ($DK4 != (int)($DK4))
    зачет!
    Кстати, еще не известно какой вариант точнее
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Ты написал "если получаем 0".
    А я написал "не больше заранее заданной точности, скажем 0.001".

    It makes sense
     
  14. Cyrius

    Cyrius Активный пользователь

    С нами с:
    3 июл 2016
    Сообщения:
    98
    Симпатии:
    4
    я вникаю как бы,я писал даже по этому поводу в эту тему вам, но сообщение походу удалилось.. не суть . Спасибо.
    --- Добавлено ---
    Всем спасибо! Получилось. Способ mkramer помог. Тему можно считать закрытой