Разделение переменных в округлении PHP

У меня есть простой скрипт калькулятора для расчета информации о Facebook.

В моем скрипте есть функция fb_growth, в которую я передаю два аргумента: один для данных за текущий месяц ($moc) и один для данных за предыдущий месяц ($mop), и я пытаюсь найти процент роста (положительный или отрицательный). ) между 2. Вот мой сценарий функции:

//Growth Calculator Function
function fb_growth($moc, $mop) {
    if($moc>=$mop) {
        $grp = ($moc/$mop);
        $grf = ($grp - 1);
        return $grf;
    }
    else if($moc<$mop) {
        $grp = ($mop/$moc);
        $grf = (1 - $grp);
        return $grf;
    }
}

Значения, которые я ввожу, поступают из формы, которую заполняет пользователь. В этом конкретном случае переданные числа равны fb_growth($fbfi1, $fbfi2);, где $fbfi1 соответствует строке '1719223', а $fbfi2 соответствует строке '1859867'. В этом случае $moc меньше, чем $mop, поэтому 1719223 делится на 1859867, что должно вернуть 1,08180672315, но вместо этого возвращается 1, из которого затем вычитается 1, чтобы получить 0. В итоге я хочу получить '- 0,08180672315', что было бы моим процентом роста, но я не могу заставить его дать мне этот результат. Если я echo ("1859867"/ "1719223");, то я получаю 1.08180672315, но когда строки хранятся в переменных и я echo ("$fbfi2" / "$fbfi1");, я получаю 1.

Я попробовал settype() для double и int для $grf и для $fbfi1 и 2 и того же результата. Если я установлю $grf как глобальный и echo gettype(), он даст мне двойное или целое число, но я все равно получу то же значение: 0. Есть ли что-то, что я могу настроить для этого в моих настройках php, или есть что-то не так с моей настройкой? Я не могу найти никакой документации. Помощь очень ценится, спасибо!!


person Dante Cullari    schedule 10.03.2012    source источник


Ответы (2)


PHP выполняет автоматическое приведение типов, см. руководство по жонглированию типами. Целочисленное деление дает целочисленный результат (отсюда и 1).

Приведите значения перед выполнением арифметических вычислений: (float) $var

person Karoly Horvath    schedule 10.03.2012
comment
Итак, я привел $fbfi1 и 2 числа с плавающей запятой с помощью (float) $fbfi1 = $_POST['pvm1']; где он устанавливает значение из формы, а также использует $grp и $grf как числа с плавающей запятой в функции, но я все равно получаю тот же результат. - person Dante Cullari; 10.03.2012
comment
Теперь мой код выглядит следующим образом: //Функция калькулятора роста function fb_growth($moc, $mop) { if($moc›=$mop) { (float) $grp = ($moc/$mop); (с плавающей запятой) $grf = ($grp - 1); вернуть $грф; } elseif($moc‹$moc) { (float) $grp = ($mop/$moc); (с плавающей запятой) $grf = (1 - $grp); вернуть $грф; } } с кодом из комментария выше также для аргументов, переданных в - person Dante Cullari; 10.03.2012
comment
вы все еще делаете целочисленное деление. один из операндов должен быть с плавающей запятой. - person Karoly Horvath; 11.03.2012

И проблема была... запятая в числах входа!! Я вводил 123 456 вместо 123 456. Это то, что вы получаете, когда просто небрежно копируете и вставляете иногда... вау. Спасибо за всю помощь, я многое узнал о кастинге!

person Dante Cullari    schedule 06.06.2012