За последние 24 часа нас посетили 55277 программистов и 1712 роботов. Сейчас ищут 1015 программистов ...

Поясните результат

Тема в разделе "Прочие вопросы по PHP", создана пользователем DZEN, 18 апр 2012.

  1. DZEN

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

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Код (Text):
    1. <?php
    2. $x = 1.5;
    3. $y = 2.5;
    4. for ($i=0; $i<10; $i++)
    5.     $x += 0.1;
    6. if ($x == $y)
    7.     echo 'X ravno Y';
    8. else
    9.     echo 'X ne ravno Y';
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Ты фигурные скобки не забыл?
    Код (PHP):
    1. <?php
    2. $x = 1.5;
    3. $y = 2.5;
    4. for ($i=0; $i<10; $i++){
    5.     $x += 0.1;
    6. if ($x == $y)
    7.     echo 'X ravno Y';
    8. else
    9.     echo 'X ne ravno Y';
    10. echo '<br/>';
    11. } 
    И что пояснять, что $x никогда не равен $y? Если да, то тип float нужно приводить к нужной точности перед сравнением.

    Добавлено спустя 9 минут 38 секунд:
    Так всё ок.
    Код (PHP):
    1. <?php
    2. $x = 1.5;
    3. $y = 2.5;
    4. $y2 = (int)($y * 10000);
    5.  
    6. for ($i=0; $i<10; $i++){
    7.   $x += 0.1;
    8.   $x2 = (int)($x * 10000);
    9.   if ($x2 == $y2)
    10.     echo 'X ravno Y';
    11.   else
    12.     echo 'X ne ravno Y';
    13.   echo '<br/>';
    14. } 
     
  3. DZEN

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

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Со скобками всё нормально, а вот $y2 = (int)($y * 10000); это бред какой-то.
    P.S. написал на Pascal, Python, Ruby - та же фигня, точность представления вещественных чисел ограничена.

    Добавлено спустя 47 секунд:
    Танцы с бубном
    Код (Text):
    1. $x = 1.5;
    2. $y = 2.5;
    3. for ($i=0; $i<10; $i++)
    4.     $x += 0.1;
    5. if ((string)$x == (string)$y)
    6.     echo 'X ravno Y';
    7. else
    8.     echo 'X ne ravno Y';
     
  4. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Через приведение к точности функцией round тоже работает:
    Код (PHP):
    1. <?php
    2. $x = 1.5;
    3. $y = 2.5;
    4. for ($i=0; $i<10; $i++){
    5.     $x += 0.1;
    6.     if (round($x, 1) == round($y, 1))
    7.         echo 'X ravno Y';
    8.     else
    9.         echo 'X ne ravno Y';
    10.     echo '<br/>';
    11. } 
    1. Без скобок у меня лично не работает.
    2. Ещё не известно, что быстрей, первый способ с умножением, для получения целого числа, или вызов функции roud. Так что не бред. Вот к string приводить, это уже бред.

    PS. Если пишешь на Pascal, Python, Ruby, то вообще почему такие детские вопросы?
     
  5. DZEN

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

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Со скобками задумывалась проверка последнего числа. Вот он, код моей мечты! Но всё равно как-то это бредово…
    Код (Text):
    1. $x = 1.5;
    2. $y = 2.5;
    3. for ($i=0; $i<10; $i++)
    4.     $x += 0.1;
    5. if (round($x, 1) == round($y, 1))
    6.     echo 'X ravno Y';
    7. else
    8.     echo 'X ne ravno Y';
    У меня позапрошлый проект на Zend Framework, прошлый на Django, текущие два финансовые и жирные на FuelPHP. Но я ведь от количества умнее не становлюсь - так что меняет количество знаний, а не глубина? Да ничего. Вот я и начал в саму суть копать, от XSS до вещественных чисел.