比较大于1000的数字时的奇怪JavaScript行为

时间:2013-04-19 21:08:59

标签: javascript boolean-logic

我编写了一个javascript函数,用于检查金额是否大于0且小于一定金额。例如,如果应付总金额为800.00美元,并且用户试图支付1100美元,我希望该功能首先检查支付的金额($ 1100)是否大于0(true)并且支付的金额也少于比应付的总金额(假)。我很确定我的逻辑很好,但是这个功能还没有正常工作:

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

2 个答案:

答案 0 :(得分:4)

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

请改为尝试:

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

(参见parseFloat docs。)

修改: toFixed()会返回一个字符串 - 请参阅toFixed docs

答案 1 :(得分:4)

你的输出给出了它们是字符串的事实 - 打印实际数字类型永远不会有无关的0。在打印号码时看892.50是不可能的。

.toFixed()返回一个字符串,而不是数字btw。

适用于> 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,这在这里没用。