我有一个动态大小的数组,看起来像这样:
var myArray = [0.10,0.12,0.08,0.08];
数组可以具有比上面更多或更少的值。
这里的目的是将它们插入以下公式:
var iFormula = 1 - ((1 - value1)*(1 - value2)*(1 - value3)* ... (1 - valuen))
我尝试了以下for循环:
for(var i = 0; i < myArray .length; i++) {
iResult = iResult * (1 - myArray[i])
};
然后从1减去iResult但是你可以想象,做上面的循环与计算iFormula不同。例如,使用我问题顶部的数组,如果我将两个0.08值组合在一起以生成以下数组:
var myArray = [0.10,0.12,0.16];
以下两个等式使用相同的有效数字,但产生两种不同的结果:
var iResult_1 = 1 - ((1 - 0.10)*(1 - 0.12)*(1 - 0.08)*(1 - 0.08)); // 0.3297
var iResult_2 = 1 - ((1 - 0.10)*(1 - 0.12)*(1 - 0.16)); // 0.3347
由于数组是动态调整大小的,我不知道当数组到达我的代码的某个部分时,数组中有多少个值。因此,我不能将公式硬编码为:
var iFormula = 1 - ((1 - myArray[0])*(1 - myArray[1])*(1 - myArray[2])
我有什么想法可以构建这个吗?做这种事还有更好的方法吗?
答案 0 :(得分:0)
试试这个
iResult =1;
for(var i = 0; i < myArray .length; i++) {
iResult = iResult * (1 - myArray[i])
};
iResult = 1 - iResult ;
答案 1 :(得分:0)
您需要使用myArray[i]
访问数组元素。并确保在循环之前正确初始化iResult
。
var myArray = [0.10,0.12,0.08,0.08];
var value1 = myArray[0],
value2 = myArray[1],
value3 = myArray[2],
value4 = myArray[3];
var iFormula = 1 - ((1 - value1)*(1 - value2)*(1 - value3)* (1 - value4));
document.getElementById('iFormula').innerHTML = iFormula;
var iResult = 1;
for(var i = 0; i < myArray.length; i++) {
iResult = iResult * (1 - myArray[i])
};
iResult = 1 - iResult;
document.getElementById('iResult').innerHTML = iResult;
&#13;
<div>iFormula = <span id="iFormula"></span></div>
<div>iResult = <span id="iResult"></span></div>
&#13;
答案 2 :(得分:0)
基于for
循环的算法没问题。
我只是想知道您希望iResult_1
和iResult_2
如何相等。这是我荒谬的演示:
(1 - 1) !== (1 - 0.5) * (1 - 0.5)
// 0 !== 0.25
关于以更好的方式进行此计算的方法,这是基于Array.prototype.reduce
的建议:
function calculate(arr) {
return 1 - arr.reduce(function(res, cur) {
return res * (1 - cur);
}, 1);
}
document.write(calculate([0.10, 0.12, 0.08, 0.08]));