货币价值的PHP算法

时间:2018-11-06 07:10:06

标签: php types floating-point currency decimal-point

我有一个具有以下输入的表格:

<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();
}

金额,利息金额,每笔利息和总金额以2精度存储为数字。 (PostgreSQL)。

现在我的问题是:

  • 如何对可能包含或不包含这些输入的计算 小数点后最多两个位(我读过某个地方关于浮点数的运算比较棘手)
  • 我该如何正确,准确地计算客户端和服务器端的上述信息。

用于客户端代码演示的JS Fiddle链接:https://jsfiddle.net/deepakthakur07/dnyrf6gt/2/

0 个答案:

没有答案