Я создаю рекламную платформу на основе биткойнов для портала обучения биткойнам. Причина, по которой я упоминаю это, я считаю, это поможет понять мою проблему, и, таким образом, я могу найти лучшее решение. Я просто передаю сумму, которую пользователь заплатит из формы HTML, на страницу PHP и проверяет, кратно ли это 10. Фрагмент кода выглядит следующим образом …
$orderAmount = $_POST['orderAmount'];
$adUnitPrice = 0.001;
if((($orderAmount/$adUnitPrice) % 10) == 0)
$standardPayment = true;
else
$standardPayment = false;
Когда я передаю $ orderAmount как 0,6 или 0,8, я получаю ожидаемый возврат $ standardPayment = true. Но когда я передаю $ orderAmount как 0,7, я получаю неожиданный возврат $ standardPayment = false !!! Может кто-нибудь подскажите пожалуйста в чем проблема и как это исправить?
BCMath модуль может помочь вам
bcmod(bcdiv("0.7", "0.001"), "10"); // returns 0
в вашем коде
$orderAmount = $_POST['orderAmount'];
$adUnitPrice = 0.001;
if(bcmod(bcdiv($orderAmount, $adUnitPrice), 10) == 0) {
$standardPayment = true;
} else {
$standardPayment = false;
}
или даже
$standardPayment = (bcmod(bcdiv($orderAmount, $adUnitPrice), 10) == 0);
вы можете проверить в командной строке php -m
и посмотри есть ли модуль или напиши файл со следующим
<?php phpinfo(); ?>
и посмотрите, если есть включить модуль BCMath
Ни 0,7, ни 0,001 не являются именно так Представлено в математике с плавающей точкой IEEE 754 — см. множество других связанных вопросов здесь.
Следовательно, когда вы делите 0,7 на 0,001, вы не получаете ровно 700, а вместо этого что-то очень близкое к 700 (вероятно, 699,9999999999988631316), и поэтому проверка модуля не проходит.
Вы должны округлить свою цену до ближайшего цента (или десятой доли цента, или аналогичного значения), а затем выполнить тест «стандартного платежа».