1

我写了一个 javascript 函数,它应该检查一个金额是否大于 0 并且小于某个金额。例如,如果应付的总金额为 800.00 美元,并且用户尝试支付 1100 美元,我希望函数首先检查支付的金额 ($1100) 是否大于 0(真)并且支付的金额是否也更少超过应付总额(假)。我很确定我的逻辑没问题,但是这个函数没有正常工作:

function validate_payment_amount() {
    var payment_amt = get_amount_paying(); // 1100.00
    var amt_due = get_amount_due(); // 800.00

    console.log('Is ' + payment_amt + ' greater than 0?: ' + (payment_amt > 0));
    console.log('&&');
    console.log('Is ' + payment_amt + ' less than or equal to ' + amt_due + '?: ' + (payment_amt <= amt_due));

    return payment_amt > 0 && payment_amt <= amt_due;
}

payment_amount如果小于 1000 ,该函数会正确评估,这是控制台输出:

Is 999.00 greater than 0?: true
&&   
Is 999.00 less than or equal to 892.50?: false

所以上面的工作正常。但是,当我给它一个大于 1000的数字时,控制台会显示:

Is 1001.00 greater than 0?: true
&&
Is 1001.00 less than or equal to 892.50?: true

任何人都可以对此有所了解吗?

编辑: get_amount_paying()get_amount_due()

function get_amount_due() {
    return parseFloat($("#still_due").data('amount')).toFixed(2);
}

function get_amount_paying() {
    return parseFloat($("#make_payment").val()).toFixed(2);
}
4

2 回答 2

4

您是否在比较字符串而不是数字?这将解释你的结果。

试试这个:

var payment_amt = parseFloat(get_amount_paying());
var amt_due = parseFloat(get_amount_due());

(请参阅parseFloat 文档。)

编辑: toFixed()返回一个字符串 - 请参阅toFixed 文档

于 2013-04-19T21:12:36.010 回答
4

您的输出放弃了它们是字符串的事实 - 打印实际数字类型永远不会有多余的 0。打印数字时看到892.50是不可能的。

.toFixed()返回一个字符串,而不是一个数字顺便说一句。

它适用于> 0,因为在比较时string > number,字符串会在比较之前自动解析为数字。

它不起作用,payment_amt <= amt_due因为它们都是字符串,因此完成了字符串比较,并且没有解析它们的数值。

尝试

function get_amount_due() {
    return parseFloat($("#still_due").data('amount'))
}

function get_amount_paying() {
    return parseFloat($("#make_payment").val())
}

不同之处在于删除toFixed,这在此处是无用的。

于 2013-04-19T21:18:37.300 回答