我编写了一个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);
}
答案 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
,这在这里没用。