(0,7 / 0,001)% 10 не возвращается 0

Я создаю рекламную платформу на основе биткойнов для портала обучения биткойнам. Причина, по которой я упоминаю это, я считаю, это поможет понять мою проблему, и, таким образом, я могу найти лучшее решение. Я просто передаю сумму, которую пользователь заплатит из формы 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 !!! Может кто-нибудь подскажите пожалуйста в чем проблема и как это исправить?

0

Решение

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

3

Другие решения

Ни 0,7, ни 0,001 не являются именно так Представлено в математике с плавающей точкой IEEE 754 — см. множество других связанных вопросов здесь.

Следовательно, когда вы делите 0,7 на 0,001, вы не получаете ровно 700, а вместо этого что-то очень близкое к 700 (вероятно, 699,9999999999988631316), и поэтому проверка модуля не проходит.

Вы должны округлить свою цену до ближайшего цента (или десятой доли цента, или аналогичного значения), а затем выполнить тест «стандартного платежа».

2

По вопросам рекламы [email protected]