Нежелательные эффекты при расчете 2 сумм с помощью jQuery

Я не получаю желаемый результат с этим кодом. Кажется, что все работает, за исключением, если, например, вы вводите что-нибудь между 100 и 199. Это дает отрицательное число в другом окне, когда я хотел бы просто разделить баланс на оба поля. Вы можете увидеть рабочий пример здесь: http://jsfiddle.net/bFJq2/ (введите 100, чтобы понять, что я имею в виду)

Не уверен, что если я что-то делаю не так, я чувствую, что число трактуется как десятичное или Любая помощь с благодарностью.

Вот JS:

// make sure both inputs are equal to balance
$('input[id*="amount"]').on("blur", function() {
    var balance     = $('#balance').val()
       ,thisAmount  = $(this)
       ,otherAmount = $('input[id*="amount"]').not(this);

    // check if value is less than balance
    if(thisAmount.val() < balance && thisAmount.val() + otherAmount.val() <= balance){
        // if so populate other input with remaining amount
        otherAmount.val(balance - thisAmount.val());
    }

    // check to make sure amount is not greater than balance
    if((thisAmount.val() + otherAmount.val()) > balance){
        $('input[id*="amount"]').not(this).val(function(){
            // if value is greater than balance, just split balance into both amounts
            if(thisAmount.val() > balance){
                thisAmount.val(balance/2);
                return balance/2;
            }
        });
    }
});

2 ответа

Решение

Ваши значения интерпретируются как строки, а не числа. Посмотрите, что происходит, когда вы отлаживаете:

Отладочные значения

Таким образом, сравнения представляют собой сравнения строк ("в алфавитном порядке", "100" перед "20"). Это также делает конкатенацию строк, когда вы используете + оператор.

Вам необходимо преобразовать значения в числа, прежде чем использовать их, используя Number(), parseFloat(), или же parseInt()в зависимости.

Я делал это, когда ответил Джейсон П. вы действительно используете строку вместо числа. я использовал parseInt() исправлять.

Отредактированная рабочая скрипка

// make sure both inputs are equal to balance
$('input[id*="amount"]').on("blur", function() {
    var balance     = parseInt($('#balance').val());
    var thisAmount  = $(this);
    var otherAmount = $('input[id*="amount"]').not(this);

    // check if value is less than balance
    if(parseInt(thisAmount.val()) < balance && parseInt(thisAmount.val()) + parseInt(otherAmount.val()) <= balance){
        // if so populate other input with remaining amount
        otherAmount.val(balance - thisAmount.val());
    }

    // check to make sure amount is not greater than balance
    if((parseInt(thisAmount.val()) + parseInt(otherAmount.val())) > balance){
        $('input[id*="amount"]').not(this).val(function(){
            // if value is greater than balance, just split balance into both amounts
            if(parseInt(thisAmount.val()) > balance){
                thisAmount.val(balance/2);
                return balance/2;
            }
        });
    }
});
Другие вопросы по тегам