JavaScript:两个数值之间的百分比差异

15

我正在使用以下的 Javascript 代码来显示两个数值之间的百分比差异。

A = 11192;
B = 10474;

percDiff = (vars.A - vars.B) / vars.B * 100;

得出结果为:6.855069696391064

然后

if (percDiff > 20) {
  //dosomething
} else {
  //dosomething
}

问题是:

如果值B高于值A,那么我得到一个NaN,例如;NaN

我该如何解决这个问题?我考虑使用Math.abs()

有什么建议吗?


1
不太确定为什么会得到NaN,因为(10474-11192)/10474*100应该得出-6.855069696391064。 - phuzi
抱歉,应该按vars.B进行分割,我会更新代码。 - David Garcia
1
这并不改变“NaN”没有意义的事实。你是如何设置/获取那些字段的值的? - Cerbrus
好的,我要使用parseInt,马上回来。 - David Garcia
1
@ Meredith——由于没有使用+运算符,因此无论值是字符串还是数字,数学运算都会将它们转换为数字,所以这并不重要。 - RobG
显示剩余5条评论
3个回答

36

我认为您可以使用这个公式来确定2个值之间的相对差异(百分比):

var percDiff =  100 * Math.abs( (A - B) / ( (A+B)/2 ) );

这是一个实用方法:

function relDiff(a, b) {
 return  100 * Math.abs( ( a - b ) / ( (a+b)/2 ) );
}
// example
relDiff(11240, 11192); //=> 0.42796005706134094

注意:对于认为答案给出了错误结果的人:这个问题/答案涉及到百分数差异1,而不是百分数变化2

下面是一个代码片段来演示它们之间的差异(双关语);

const relativePercentageDifference = (a, b) => 
  Math.abs( ( ( a - b ) / ( ( a + b ) / 2 ) ) * 100 );
const percentageChange = (a, b) => ( b / a * 100 ) - 100;
console.log(`relative % difference 2000 - 1000: ${
  relativePercentageDifference(2000, 1000).toFixed(2)}%`);
console.log(`% change 2000 - 1000: ${
  percentageChange(2000, 1000).toFixed(2)}%`);
console.log(`relative % difference 1000 - 2000: ${
  relativePercentageDifference(1000, 2000).toFixed(2)}%`);
console.log(`% change 1000 - 2000: ${
  percentageChange(1000, 2000).toFixed(2)}%`);

JsFiddle

1 两个数值间的百分比差异,除以这两个数值的平均值。

2 两个数字间的百分比差异(增加/减少),除以原始数字。


1
显然我得到NaN,因为方程的结果是0.xxxxx,因此是一个无法表示的值。 - David Garcia
添加了一个实用方法到答案中。如果你仍然得到 NaN,那么输入值中有一个或多个不是数字。 - KooiInc
1
在a和b之前添加“+”将删除NaN。 - NVRM
6
对于 20001000,这个返回值是 66.7%,但我认为这是错误的……? - devman
1
@devman 这是百分比「差异」。在此链接中阅读相关内容:http://www.mathsisfun.com/percentage-difference.html,特别是「为什么我们要取两个值的平均值?」这一部分。 - KooiInc
显示剩余3条评论

1
在需要知道某个数字与基准数字的差异时:
function percDiff(etalon, example) {
  return  +Math.abs(100 - example / etalon * 100).toFixed(10);
}
// example
percDiff(11240, 11192); //=> 0.4270462633
percDiff(1000, 1500); //=> 50
percDiff(1000, 500); //=> 50

1
diffPercent = function(a, b) {
 return  ( a<b ? "-" + ((b - a) * 100) / a : ((a - b) * 100) / b ) + "%";
}

1
我认为返回一个字符串并不像直接返回计算结果那样有用。另外,为什么要连接“-”呢?为什么不直接取反呢? - General Grievance
结果是相反的,但这是一个很好的函数。 - Fed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接