同时循环增加数字,直到高于或等于目标



>本质上,我想做的是在我的代码中有一个while循环,将一个添加到分数中,直到它到达一个目标,我发现这个目标可以很容易地用一个基本的while循环来完成。但是,在我的版本中,它会略有不同,正如您将在下面的代码中看到的那样。

我正在做的是让用户输入 4 个数字:目标、发起人、中立者和批评者。

对于他们进入的每个发起人,给 100 分,中立者给 0,批评者给 -100。然后取一个最终平均值,该平均值将与他们最初输入的目标进行比较,这就是我希望while循环进入的地方,我希望循环自动告诉用户他们需要多少启动器才能实现目标。

因此,在用户的目标为 75 的示例中,他们有 3 个发起人、2 个中立者和 1 个批评者。这将使他们平均为33.33(200/6(。而且,我手动计算出他们需要 10 个以上的发起人才能使分数变为 75,因此,达到他们分配的目标。

在过去的几天里,我一直在玩很多不同的while循环,但什么也没想出来,这就是为什么我要求助于你们这些专家。

代码如下。这只是我现在完成这项工作的最后一块拼图。

这是我的HTML和JavaScript。

/* eslint-env browser */
// eslint.rc
{
"no-unused-vars" [2, {"args": "none"}]
}
"use strict";

$(document).ready(function () {

$('#target, #proNum, #neuNum, #detNum').change(function () {
var target = $('#target').val();
var proNum = $('#proNum').val();
var neuNum = $('#neuNum').val();
var detNum = $('#detNum').val();

console.log("target is equal to " + target);
console.log("promitors is equal to " + proNum);
console.log("neutrals is equal to " + neuNum);
console.log("detractors is equal to " + detNum);

var targetTot = (target*10);
var prosTot = (proNum*100);
var neusTot = (neuNum*0);
var detsTot = (detNum*-100);

console.log("Target is " + targetTot);

var scoresQuant = +proNum + +neuNum + +detNum;  
var scoresTot = prosTot+neusTot+detsTot;
var preCurrent = scoresTot/scoresQuant;
var current = Math.round(preCurrent*100)/100;

console.log("scoresQuant is equal to " + scoresQuant);
console.log("scoresTot is equal to " + scoresTot);
console.log("preCurrent is equal to " + preCurrent);
console.log(current);

$('#current').text(current);
var hypPro = 0;
var scoresTotLoop = scoresTot/100;
var targetLoop = target/10;

while (scoresTotLoop/scoresQuant+hypPro<=targetLoop)  {
hypPro++;
} 
console.log("hypPro is equal to " + hypPro);       

$('#prosToTarget').text(hypPro);
});

});
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>NPS Calculator</title>

<!-- Linking to external sheets -->
<link rel="stylesheet" type="text/css" href="css/style.css">
<script src="https://code.jquery.com/jquery-3.3.1.js" integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60=" crossorigin="anonymous"></script>
<script type="text/javascript" src="js/script.js"></script>
<!-- End of linking to external sheets -->

<!-- Font Imports -->
<link href="https://fonts.googleapis.com/css?family=Nunito+Sans:300,400,700" rel="stylesheet">
<!-- End of font Imports -->

</head>
<body>
	<div id ="headers">
		<h1>NPS Calcultor</h1>
		<h2>This site will help you work out the total number of promoters you need to achieve your target this month.</h2>
	</div>
	<div id = "calculator">
		<div id = "targetNPS">
<table  id ="targetTable">
<tr>
<td>
<h2>Target NPS</h2>
</td>
<td>
<input type="text" class="IO" id = "target"/>
</td>
</tr>
</table>
</div> 
		<div id = "scores">
<table id = "scoresTable">
<tr>
<td>
<h2>Promoters</h2>
</td>
<td>
<h2>Neutrals</h2>
</td>
<td>
<h2>Detractors</h2>
</td>
</tr>
<tr>
<td class = "pros">
<input type="text" class="IO" id = "proNum"/>
</td>
<td class = "neus">
<input type="text" class="IO" id = "neuNum"/>
</td>
<td class = "dets">
<input type="text" class="IO" id = "detNum"/>
</td>
</tr>
</table>
		</div>
		<div id = "currentNPS">
<table id = "currentTable">
<tr>
<td>
<h2>Current NPS</h2>
</td>
<td>
<h2 class="IO" id = "current">0</h2>
</td>
</tr>
</table>
		</div>
		<div id = "prosToTargetNPS">
			<table id ="prosToTargetTable">
<tr>
<td>
<h2>Promitors to Target</h2>
</td>
<td>
<h2 class="IO" id = "prosToTarget">0</h2>
</td>
</tr>
</table>           
		</div>
	</div>
</body>
</html>

考虑所需总促进器 (10+3( 的x,输入促进器 (3( 的p,输入中性线 (2( 的n和输入批评者 (1( 的d

所以,我们有以下等式-(100x + 0n - 100d)/(x+n+d) = 75

或者,100(x - d)/(x+n+d) = 75

或者,x-d = 0.75(x+n+d)

或者,x-0.75x = 0.75n + 0.75d +d

或者,0.25x = 0.75n + 1.75d

或者,x = (75/25)n + (175/25)d-------(1(

或者,x = 3n + 7d

由于nd已经存在,因此 2 和 1

,x = 3*2 + 7*1 = 13 和 x-p = 13 - 3 = 10 需要 10 个促进器。

如何在代码中实现这一点?如您在公式(1(中看到的

  1. n乘以(target/(100-target))
  2. d乘以(100+target)/(100-target)
  3. 添加它们以获得总促销员
  4. 减去输入启动器以获得所需的启动器。

无需循环。这里假设目标始终可以通过仅添加启动器来实现。

我已经设法解决了这个问题,通过使用将其视为上面的方程的想法。这是我找到的解决方案,我所做的是将 @psinaught 发布的方程分配给目标为 y,将优点组合为 x,中性为 n,批评者为 d,然后求解 y。然后生成等式,我将正确的变量换成下面的等式。

var preProsToTarget = ((detNum*target)+(neuNum*target)+(100*detNum))/(-target+100); 
var prosToTarget = Math.max(0,preProsToTarget-proNum);

正如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 也向用户打印描述文本,否则一个带有 || 的 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!");

最新更新