Меньше, чем оператор не работает должным образом в цикле PHP в то время как - PullRequest
2 голосов
/ 13 февраля 2020

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

Пожалуйста, обратитесь к следующему коду:

<?php
$amount_perpoints = bcdiv(622.9106666666667,1,2); // AMOUNT OF MONEY PER POINTS
$request_amount = 3114.55; //REQUESTED AMOUNT OF POINTS

$points = 0; // THIS WILL CONTAIN THE TOTAL POINTS
$total_amount = 0; // THIS WILL INCREMENT ACCORDING TO THE PRODUCT OF THE CURRENT POINT AND AMOUNT PER POINTS

while($total_amount < $request_amount){ 
    $points = $points+0.50; //POINTS INCREMENTING BY 0.5
    $total_amount = $points * $amount_perpoints;
}

echo $points;

?>

Вывод: 5.50

Выше сценария выводится 5.50, но я считаю, что это должно быть только 5.00. В 5.00 точках итерации $total_amount и $request_amount уже имеют одинаковое значение 3114.55. Почему в то время как l oop все еще удовлетворяет, даже два значения сравниваемых переменных не меньше, НО РАВНО?

Ответы [ 4 ]

1 голос
/ 13 февраля 2020

Вы сравниваете числа с плавающей точкой. Попробуйте использовать

while (bccomp($total_amount, $request_amount) === -1) {
0 голосов
/ 13 февраля 2020

Ошибки возникают при расчете с дробными долями в виде числа с плавающей запятой. Float не может точно представлять определенные десятичные числа. Для таких расчетов используйте только математические функции B C. Вам тоже не нужно все oop.

$amount_perpoints = "622.91"; // AMOUNT OF MONEY PER POINTS
$request_amount = "3114.55"; //REQUESTED AMOUNT OF POINTS for result 5.0
//$request_amount = "3426.005"; //REQUESTED AMOUNT OF POINTS for result 5.5

$point_step = "0.50";

//calculation
$points = bcdiv($request_amount,$point_step,2);
$points = bcdiv($points,$amount_perpoints,0);
$points = bcmul($points,$point_step,1);

//output
var_dump($points);  //string(3) "5.0"
0 голосов
/ 13 февраля 2020
<?php
$amount_perpoints = bcdiv(622.9106666666667,1,2); // AMOUNT OF MONEY PER POINTS
$request_amount = 3114.55; //REQUESTED AMOUNT OF POINTS

$points = 0; // THIS WILL CONTAIN THE TOTAL POINTS
$new_points=0;
$total_amount = 0; // THIS WILL INCREMENT ACCORDING TO THE PRODUCT OF THE CURRENT POINT AND AMOUNT PER POINTS

while($total_amount < $request_amount){
    $points=$new_points;
    $new_points = $new_points+0.50; //POINTS INCREMENTING BY 0.5
    $total_amount = $new_points * $amount_perpoints;
}

echo $points;

?>
0 голосов
/ 13 февраля 2020

Я думаю, что @jeff прав:

 $amount_perpoints = bcdiv(622.9106666666667,1,2); // AMOUNT OF MONEY PER POINTS
    $request_amount = 3114.55; //REQUESTED AMOUNT OF POINTS

    $points = 0; // THIS WILL CONTAIN THE TOTAL POINTS
    $total_amount = 0; // THIS WILL INCREMENT ACCORDING TO THE PRODUCT OF THE CURRENT POINT AND AMOUNT PER POINTS

    while($total_amount <= $request_amount){ 
        $points = $points+0.50; //POINTS INCREMENTING BY 0.5
        $total_amount = $points * $amount_perpoints;
    }

    echo $points;

Поскольку вы рассчитываете, пока он не достигнет желаемой точки, он может быть меньше ИЛИ равным. Это дает выход: 5,5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...