как уже говорилось в psinaught, решение будет не циклом while, а уравнением.опубликованное решение уже движется в правильном направлении - но, насколько я вижу, работает только тогда, когда pVal и dVal имеют одинаковое абсолютное значение.Еще одним недостатком является то, что, поскольку ваш пример имеет значение 0 для нейтралов, нейтральное значение было удалено при упрощении его уравнения.поэтому, как только нейтралы получат значение, отличное от 0, оно больше не будет работать ...
, если все (числа и значения) могут быть общими, уравнение будет:
x = ( n * ( target - nVal ) + d * ( target - dVal) ) / ( pVal - target )
Кроме того, вы хотели бы проверить, если цель не превышает pVal, поскольку цель является средней, она больше не будет доступна.
вот ссылка на мою рабочую скрипку: http://jsfiddle.net/bq1f02pk/2/ вы можете настроить все числа, независимо от того, количество или значения.
что я сделал в части js:
сначала я связал событие 'onChange' со всеми полями ввода, чтобы функция выполнялась каждый раз, когда вы меняете число
$("input").on("change", function() {
Далее, чтобы заставить математическую часть работать и избавиться от селекторов jquery, я извлек все входные значения в переменные:
var target = parseInt($("#target").val());
var proms = parseInt($("#p").val());
var pVal = parseInt($("#pval").val());
var neuts = parseInt($("#n").val());
var nVal = parseInt($("#nval").val());
var dets = parseInt($("#d").val());
var dVal = parseInt($("#dval").val());
Ниже приведены некоторые проверки правильности ввода:
if (target == pVal) { // only achievable without n's and d's
return false;
} else if (target > pVal) { //not reachable
return false;
} else if( neuts == 0 && dets == 0){ //no calculation needed
return false;
}
в моей скрипке, эти три if также печатают тексты описания для пользователя, в противном случае - один, если с ||было бы достаточно.
теперь, наконец, у нас есть вычисление:
var totals = var totals = ( neuts * ( target - nVal ) + dets * ( target - dVal ) ) / ( pVal - target );
var remaining = totals - proms;
, и чтобы помочь пользователю понять его проблему, вы можете дополнительно создать длинный текст для объяснения результатов:
$("#result").text("to reach your target of " + target + " you need " + totals + " promoters in total. you already have " + proms + " promoters, so you need " + remaining + " more promoters!");