PHP арифметика на денежные значения - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть форма, которая имеет следующие входные данные:

<input type="text" name="amount" id="amount" maxlength="10" onblur="applyInterest();" />
<input style="width:60px" type="text" name="interest" id="interest" maxlength="6" placeholder="Interest" onkeyup="applyInterest();" />&nbsp;%
<input type="text" name="total_amount" id="total-amount" maxlength="10" readonly />

function applyInterest()
{
    var amount = parseInt(document.getElementById('amount').value);
    var interest = parseInt(document.getElementById('interest').value);
    var int_amount = Math.round((interest/100)*amount);
    document.getElementById('total-amount').value = (amount + int_amount);
}
  • Входные данные могут иметь или не иметь десятичные точки (1000, 1000.57) (если они имеют десятичную точку, это может быть до двух десятичных точек, таких как (10.20, 10.25, 1000.50).
  • При вводе процентной ставки (%) и стоимости ввода суммы я рассчитываю сумму процентов и добавляю ее к сумме, а затем заполняю поле общей суммы. Используемая функция: applyInterest ();
  • Затем при отправке я снова рассчитываю проценты и добавляю их к сумме, чтобы сделать общую сумму, и проверяю, совпадает ли общая сумма с полученной в $ _POST.

Код серверной стороны:

$amount = trim($_POST['amount']);
$interest_per = trim($_POST['interest']);
$total_amount = trim($_POST['total_amount']);
$error = array();

if ( ! preg_match('/^[1-9][0-9]*(\.[0-9]{1,2})?$/', $amount)) {
    $error[] = 'Invalid amount';
}

if ( ! preg_match('/^[1-9][0-9]*(\.[0-9]{1,2})?$/', $total_amount)) {
    $error[] = 'Invalid total amount';
}

if ( ! empty($interest_per)) {
    if ( ! preg_match('/^[1-9][0-9]*(\.[0-9]{1,2})?$/', $interest_per)) {
        $error[] = 'Invalid interest';
    }
} else {
    $interest_per = 0;
}

if ( empty($error)) {
    $int_amt = round(($interest_per / 100) * $amount);
    $chk_total_amt = $amount + $int_amt;
    if ($chk_total_amt != $total_amount) {
        $error[] = "Interest plus amount is not matching total amount";
    }
}

if ( ! empty($error)) {
    $message = array('status' => 422, 'data' => $error);
    $conn = null;
    echo json_encode($message);
    exit();
}

Сумма, Interest_amount, проценты за и общая сумма сохраняется в виде чисел с точностью до 2. (Postgresql).

Теперь мои вопросы:

  • как выполнять вычисления на этих входных данных, которые могут содержать или не содержать десятичная точка до двух мест (я где-то читал, что арифметика с числами с плавающей запятой хитрая)
  • Как правильно и точно рассчитать вышеприведенные вещи как на стороне клиента, так и на стороне сервера.

JS Fiddle link для демонстрации кода на стороне клиента: https://jsfiddle.net/deepakthakur07/dnyrf6gt/2/

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