За последние 24 часа нас посетили 15774 программиста и 1544 робота. Сейчас ищут 910 программистов ...

Вопрос о делении.

Тема в разделе "Прочие вопросы по PHP", создана пользователем fagcher, 11 июл 2014.

  1. fagcher

    fagcher Новичок

    С нами с:
    11 июл 2014
    Сообщения:
    3
    Симпатии:
    0
    Привет!
    Помогите разобраться:

    Код (Text):
    1.  
    2. echo $a=round(995/9.95);
    3. echo "-";
    4. echo $b=(995/9.95);
    5. echo "=";
    6. echo $a - $b;
    Результат 100-100=-1.4210854715202E-14

    Почему такое происходит?
     
  2. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Потому что особенности внутреннего представления дробных чисел и динамическая типизация, которая трактует в данном случае как хочет. Первое число, после округления, вовсе не обязано быть равным 100. В памяти оно может быть представлено, как 99,9999999999999. Хотя отображается как 100.

    Вот и получилось, что 99,9999999999999 - 100 = 0,0000000000001. Которое, на самом деле, тоже хранится немного в странной форме. Вот и получилось у тебя 1.мусормусормусормусор E-14.
     
  4. fagcher

    fagcher Новичок

    С нами с:
    11 июл 2014
    Сообщения:
    3
    Симпатии:
    0
    - это как? - 995/9.95 - float как ни крути...
    - почему не обязательно? я еще могу согласиться, что второе число ввиду вышеупомянутой ошибки с вычисления окажется ~100.000000000000001, но round то точно должен округлить :(
    Как с этим теперь жить? :(
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Вы не понимаете? Это проблема внутреннего представления числа, а не ошибки функии round.

    echo $a=(995/9.95);
    echo "-";
    echo $b=(995/9.95);
    echo "=";
    echo $a - $b; //0

    Будет ноль, потому что получили два одинаковых числа. И они оба на самом деле не 100. Но они получены идентичным способом и, соответственно, машинное представление имеют также идентичное.

    Не использовать float для рассчета денежных операций. В остальных случаях - ничего страшного. Это не особенность пхп, это особенность компьютеров. Весь мир живет и ничего, работает.
     
  6. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Дело в том, что иногда PHP учитывает ошибку и использует округление, иногда нет (см. "машинный ноль"). echo $b=(995/9.95) выводит 100, хотя оно не 100. Просто при выводе было сделано округление. Например, JS такого не делает, попробуйте посмотрите сколько там будет 995/9.95.
     
  7. fagcher

    fagcher Новичок

    С нами с:
    11 июл 2014
    Сообщения:
    3
    Симпатии:
    0
  8. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск