Привет! Помогите разобраться: Код (Text): echo $a=round(995/9.95); echo "-"; echo $b=(995/9.95); echo "="; echo $a - $b; Результат 100-100=-1.4210854715202E-14 Почему такое происходит?
Потому что особенности внутреннего представления дробных чисел и динамическая типизация, которая трактует в данном случае как хочет. Первое число, после округления, вовсе не обязано быть равным 100. В памяти оно может быть представлено, как 99,9999999999999. Хотя отображается как 100. Вот и получилось, что 99,9999999999999 - 100 = 0,0000000000001. Которое, на самом деле, тоже хранится немного в странной форме. Вот и получилось у тебя 1.мусормусормусормусор E-14.
- это как? - 995/9.95 - float как ни крути... - почему не обязательно? я еще могу согласиться, что второе число ввиду вышеупомянутой ошибки с вычисления окажется ~100.000000000000001, но round то точно должен округлить Как с этим теперь жить?
Вы не понимаете? Это проблема внутреннего представления числа, а не ошибки функии round. echo $a=(995/9.95); echo "-"; echo $b=(995/9.95); echo "="; echo $a - $b; //0 Будет ноль, потому что получили два одинаковых числа. И они оба на самом деле не 100. Но они получены идентичным способом и, соответственно, машинное представление имеют также идентичное. Не использовать float для рассчета денежных операций. В остальных случаях - ничего страшного. Это не особенность пхп, это особенность компьютеров. Весь мир живет и ничего, работает.
Дело в том, что иногда PHP учитывает ошибку и использует округление, иногда нет (см. "машинный ноль"). echo $b=(995/9.95) выводит 100, хотя оно не 100. Просто при выводе было сделано округление. Например, JS такого не делает, попробуйте посмотрите сколько там будет 995/9.95.
Код (PHP): $a = round(bcdiv(995, 9.95)); $b = bcdiv(995, 9.95); $c = $a - $b; echo "$a-$b=$c"; так, в качестве дополнения http://php.ru/manual/refs.math.html и полноты раскрытия темы