Ошибка вычисления, помогите мне найти, пожалуйста?

#php #debugging

#php #отладка

Вопрос:

Я запускаю подписки на своем веб-сайте. У меня есть подписка на 1,3,6 и 12 месяцев, и я хотел бы, чтобы пользователь мог изменять эту подписку, когда захочет. Однако мне нужно рассчитать сумму денег, которую пользователь должен был заплатить, если бы он или она зарегистрировались на более короткий срок, а точнее, на относительно дешевый и длительный.

Я сделал эту функцию optimized_subscription_total($active_sub_time,$arr_sub_values) так, чтобы она точно возвращала эту сумму денег.

 <?php 


function optimized_subscription_total($active_sub_time,$arr_sub_values)
{

    // This function takes a row from the DB where prices for each period of time usage is listed. there are prices for 1 month, 3 months,6 and 12 months.

    // when the user has subscribed for 12 months, and the user asks for a refund, after they used 9 months and 6 days for example, the system treats the refund as if they subscribed for (in months) COST_6   COST_3   (COST_1/30)*6 
    // the result of the function is then subtracted from the amount they actually paid and is considered the refund.

    // $arr_sub_values is the associative row from the DB, containing the prices
    // $active_sub_time is measured in months and is a double

$result=0;


while(($active_sub_time-12)>=0)
{
    $active_sub_time-=12;
    $result =($arr_subscription_values['COST_12']);
}

while(($active_sub_time-6)>=0)
{
    $active_sub_time-=6;
    $result =($arr_subscription_values['COST_6']);
}
while(($active_sub_time-3)>=0)
{
    $active_sub_time-=3;
    $result =($arr_subscription_values['COST_3']);
}

while(($active_sub_time-1)>=0)
{
    $active_sub_time-=1;
    $result =($arr_subscription_values['COST_1']);
}

if($active_sub_time>0)
    $result =($active_sub_time)*($arr_subscription_values['COST_1']);

return $result;

}



$datetime1 = date_create('2009-12-11');
$datetime2 = date_create('2010-11-09');
$interval = date_diff($datetime1, $datetime2);
$num_of_months = ($interval->format('%y'))*12 ($interval->format('%m')) ($interval->format('%a'))/30;
echo "<br />";

$v = array('COST_1'=>'3.99','COST_3'=>'9.99','COST_6'=>'15.99','COST_12'=>'25.99');
echo "OPT value for $num_of_months months=" . optimized_subscription_total($num_of_months, $v);


?>
 

Как ни странно, я получаю ошибку, появляющуюся только через 7-10 раз после обновления этого кода.
Итак, я получил:

 OPT value for 10 months=M.97
 

в результате здесь. Я думаю, мне нужно получить число с плавающей запятой, нет?

Я ожидал, что результатом функции должно быть «Значение выбора за 10 месяцев = 29,97», так как оно должно принимать COST_6 COST_3 COST_1… но я получаю этот странный M.97, а иногда и такие вещи, как POKHHHG.97

Комментарии:

1. Он меняется с чего на что? Например, у меня 12-месячная подписка, я нахожусь на 2-м месяце, и теперь я изменил подписку на 3 месяца, где вы храните все эти значения?

2. Это лишь краткий обзор того, для чего используется эта функция. Если вы заплатили 25,99 за весь год (12 месяцев) и вышли из системы или обновили ее через 7 месяцев, считается, что у вас было 6 месяцев 1 месяц. и получите возмещение от предыдущих 25,99, которые вы уже заплатили. Здесь вы можете увидеть, что это такое: возврат=25.99-(15.99 3.99)=6.01 Если вы возьмете эту функцию и запустите ее, то через 10 раз увидите, что вывод глючит. например, «Значение выбора за 10 месяцев = M.97 «, где M.97 является странным. Я пытаюсь выяснить, что является причиной этого.

3. Я не тестировал код, потому что на данный момент у меня нет PHP-сервера, если вас что-то все еще беспокоит, дайте мне знать.

4. да. все еще случается… Должно быть, это какая-то утечка памяти

Ответ №1:

Я бы изменил логику на следующую и посмотрел, по-прежнему ли возникает ошибка. Я думаю, что это немного более понятно и легко отлаживается. Это то же самое, что и ваше, хотя только объяснено по-другому.

 while($active_sub_time>=12)
{
    $active_sub_time-=12;
    $result =($arr_subscription_values['COST_12']);
}

while($active_sub_time>=6)
{
    $active_sub_time-=6;
    $result =($arr_subscription_values['COST_6']);
}
while($active_sub_time>=3)
{
    $active_sub_time-=3;
    $result =($arr_subscription_values['COST_3']);
}

while($active_sub_time>=1)
{
    $active_sub_time-=1;
    $result =($arr_subscription_values['COST_1']);
}
 

Что я бы также сделал, так это добавил debug cod в верхнюю внутреннюю функцию.

 echo "<br>$active_sub_time" // debug code include at the top
 

Это даст вам представление о том, отправляется ли какой-либо мусор в саму функцию.

Также я бы добавил эту тестовую функцию во все блоки while, если вышеуказанное не решит проблему.

 if (!is_numeric($result))
{
    echo"<br> Bug occurred";break; // print other values if necessary
}
 

Комментарии:

1. Спасибо @Охотник на крокодилов, я только что добавил is_numeric в хвост функции. Это так странно, что я распечатываю это значение (теперь как I.00425), но сервер обрабатывает его нормально, он просто выводит его таким образом. тип gettype, который я получаю для него, равен double. Для вас функция тоже возвращала неправильные значения?