2015-11-10 5 views
0

У меня есть эта функциявычисление функции JQuery неправильно

$("#exchange").on("change", function() { 
    var am = $(this).val(); 
    var fee = $("#fee").val(); 
    var cost = $("#cost").val(); 
    var perc = fee/100; 
    var tot = perc * am; 
    var fea = parseFloat(tot) + parseFloat(cost); 
    var total = parseFloat(am) - parseFloat(tot) - parseFloat(cost); 
    $("#return").val(total.toFixed(2)); 
    $("#due").val("$" + fea.toFixed(2)); 
}); 
$("#return").on("change", function() { 
    var am = $(this).val(); 
    var fee = $("#fee").val(); 
    var cost = $("#cost").val(); 
    var perc = fee/100; 
    var tot = perc * am; 
    var fea = parseFloat(tot) + parseFloat(cost); 
    var total = parseFloat(am) + parseFloat(tot) + parseFloat(cost); 
    $("#exchange").val(total.toFixed(2)); 
    $("#due").val("$" + fea.toFixed(2)); 
}); 

, например, если #exchange = 16,85, #fee = 11, и #cost = 0

он должен вычислить #due = $ 1,85 и #return = 15,00

это все правильно. Проблема работает в обратном направлении, мне это нужно рассчитать так же, но вместо того, чтобы прямо сейчас я получаю это

#return = 15, #fee = 11, а #cost = 0

вычисляет #due = $ 1,65 и #exchange = 16,65

Я понимаю, почему он это делает, потому что он исчисляет комиссионные с var am, который является значением этого поля, что очень затрудняет выполнение мной того, чего я пытаюсь достичь, в обоих случаях, но я не могу назвать var am значением #exchange в моей функции #return, потому что поле было бы пустым в это время, которое рассчитало бы его на NAN, так что я могу сделать, чтобы сделать так, чтобы все мои вычисления были одинаковыми в обоих направлениях, я пытался найти лучшую часть из 5 часов, чтобы выяснить, что делать, но я потерян, точка в правильном направлении будет очень признательна.

+0

'вар перхлорэтилена = плата/100;' вы проверили, если эта часть будет сделано правильно? вместо использования 'parseFloat()' в вычислениях - просто используйте его, когда вы читаете значения. – LiranBo

+0

@LiranBo Да, это сделано правильно, и все правильно показывает, насколько расчеты идут, проблема в том, что я хочу, чтобы вычисления были одинаковыми в обоих направлениях, если '# exchange' = 16.85, что делает' # fee' = 1.85 и '# return' = 15, но если вы положите' # return' = 15, то он принимает 11% от него, делая плату только 1,65, но она должна быть 1,85, но я не уверен, как заставить ее рассчитать суммы. –

+0

О, извините, я тогда не читал.по моему опыту, лучший способ сделать что-то подобное - просто сохранить номер перед обменом, а по возврату вы вернете это число. потому что, когда вы имеете дело с типом float, будет очень сложно вернуться к точному предыдущему значению. что означает, что нажатие кнопок обмена и возврата снова и снова может значительно изменить исходное число. – LiranBo

ответ

1

Это похоже на простую проблему с вашей алгеброй. Я вижу, что вы пытаетесь сделать. В его нынешнем виде вы принимаете return = exchange - tot - cost и exchange = return + tot + cost. Проблема в том, что вы предположили, что var tot - это то же самое в вашем решении, работающем вперед, и ваше решение работает в обратном порядке.

Однако tot равно (fee/100) * exchange вперед; (fee/100) * return работает в обратном направлении, которое нарушает ваши предположения о том, как рассчитать exchange и return. Мой первый шаг состоял бы в том, чтобы отойти от задания var am и именования, которое, кажется, вас сбивает с толку, и назовите все exchange и return тем, чем они на самом деле являются. Это может помочь вам сформировать правильное алгебраическое решение, которое затем можно реализовать в JavaScript.

JSFiddle: https://jsfiddle.net/z6hrLbmc/

1

Вы используете неправильную формулу.

Использование brutto=netto/(1-fee/100) вместо brutto=netto*(1+fee/100)

Вы должны различать, является ли плата применяется к Нетто (+netto*fee/100) или к Брутто (-brutto*fee/100).

+0

вот jsfiddle, чтобы вы могли видеть, как этот сниппет работает в действии, потому что я не полностью понимая, что вы говорите https://jsfiddle.net/zrmaqkjq/ –

+0

'15/0.89' vs' 15 * 1.11' –

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