2013-04-19 1 views
1

Я написал функцию javascript, которая должна проверять, превышает ли сумма 0 и меньше определенной суммы. Например, если общая сумма должна составлять $ 800,00, и пользователь пытается заплатить 1100 долларов США, я хочу, чтобы функция сначала проверила, что выплачиваемая сумма (1100 долларов США) больше 0 (true), и что выплачиваемая сумма также меньше чем общая сумма (ложная). Я был уверен, что моя логика была в порядке, но эта функция не работает правильно:Нечетное поведение JavaScript при сравнении номеров, превышающих 1000

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 

Может кто-нибудь, пожалуйста, пролить некоторый свет на это?

EDIT: 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

Рассчитываются ли 'payment_amt' и' amt_due' как строки или поплавки? –

+0

Очень подозрительно. Может быть, ваш тип данных не является «номером», может быть, он подходит как «строка»? – Oybek

+1

Вы уверены, что вары - это цифры, а не строки? – Jensd

ответ

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, что бесполезно здесь.

+0

Благодарим вас за разъяснение о toFixed()! Никогда бы не подумал, что это будет источником проблемы :) –

4

Вы, возможно, сравнивая строки, а не числа? Это объяснит ваши результаты.

Попробуйте вместо этого:

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

(см parseFloat docs.)

Edit:toFixed() возвращает строку - см toFixed docs.

+0

Я добавил функции (которые возвращают float) для уточнения. –

+1

@AndrewDeForest: Нет, 'toFixed()' возвращает строку. – RichieHindle

Смежные вопросы