我有一个值数组列表
var v=[0.009865,0.009866,0.009309,0.009831,0.009919,0.009965,0.009806,0.009509,0.009731,0.009888];
我计算最小值,最大值和两者之间的差值,使范围
var max=Math.max.apply(this,v)/100;
var min=Math.min.apply(this,v)/100;
var dif=max-min;
console.dir({'max':max,'min':min,'dif':dif});
控制台。dir显示
max: 0.00009965
min: 0.00009308999999999999
dif: 0.000006560000000000005
然后循环遍历每个值,试图将它们转换为
范围内的百分比(通过找出当前值比最小值大多少,将答案除以差f并将结果乘以100得到百分比)
for (var i=0;i<v.length;i++){
v[i]=((v[i]-min)/dif)*100;
console.log(v[i]);
}
console.log显示了我真的不期望看到的值(期望在0-100之间)
148962.04268292672
148977.28658536574
140486.43292682915
148443.74999999985
149785.21341463405
150486.43292682915
148062.65243902427
143535.21341463405
146919.35975609746
149312.65243902427
我做错了什么?
我对数学的参考:https://math.stackexchange.com/questions/51509/how-to-calculate-percentage-of-value-inside-arbitrary-range
设置max
和min
时不要除以100
:
var max=Math.max.apply(this,v);
var min=Math.min.apply(this,v);
输出:84.7560975609757
84.90853658536585
0
79.57317073170726
92.9878048780489
100
75.76219512195132
30.487804878048845
64.32926829268297
88.26219512195112
您可以使用Array.map
来执行此操作,例如:
var v= [0.009865,0.009866,0.009309,0.009831,0.009919,0.009965,
0.009806,0.009509,0.009731,0.009888]
,vv= v.map( function (a) {
return ( ( Math.abs(a-this.min) / this.diff() )*100 )
.toFixed(2);
},
{min: Math.min.apply(null, v),
max: Math.max.apply(null, v),
diff: function () { return this.max-this.min; } }
);
// => returns vv
// ["84.76", "84.91", "0.00", "79.57", "92.99", "100.00",
// "75.76", "30.49", "64.33", "88.26"]
MDN文档在Array.prototype.map