2011-02-24 133 views
2
var q3a1 = parseInt(valueOne); //get variables 
var q3a2 = parseInt(valueTwo); 
var q3a3 = parseInt(valueThree); 

var totalAmountThree = Math.ceil((q3a1+q3a2+q3a3)/100)*100; //round to nearest 100 

var percentOnec = ((q3a1/totalAmountThree) * 100); //calculate percentage 
var percentTwoc = ((q3a2/totalAmountThree) * 100); 
var percentThreec = ((q3a3/totalAmountThree) * 100); 

alert("1: "+percentOnec); 
alert("2: "+percentTwoc); 
alert("3: "+percentThreec); 

有沒有更好的辦法,我要計算一個比例?計算一個百分比,有沒有更優化的方法?

(撥弄我:http://jsfiddle.net/neuroflux/Sez3Q/

+0

爲什麼四捨五入到最接近的100?這似乎沒有什麼意義,但也許我失去了一些東西... – 2011-02-24 11:22:43

+0

它最初被輸出到98%或99%:/ – 2011-02-24 11:23:17

+1

四捨五入到100的沒有意義的,我要麼。由於所有值都是從一開始的整數,因此只有在計算百分比時纔會得到浮點結果。但是如果你四捨五入,你的百分比永遠不會達到100%。或者說,我相信...... – 2011-02-24 11:26:14

回答

3

可能優化這個通過計算因子,直接擴展到百分比需要:

S = A+B+C 
p(x)=100*x/S 

所以 '因素' 是100/(A+B+C)

var total = a+b+c; 
var scale = 100/total; 

function pct(x) { return x*scale; } 

,它可以是廣義的,當然,爲了與輸入值等的陣列工作...

function toPctFn(values) { 
    var sum = 0; 
    for(var i = 0; i != values.length; ++i) { sum = sum + values[i]; } 
    var scale = 100/sum; 
    return function(x){ 
    return x*scale; 
    }; 
} 

var inputs=[1,2,40,44,23]; 
var toPct=toPctFn(inputs); 

for(var i = 0; i != inputs.length; ++i) { 
    alert(""+i+": "+toPct(inputs[i])) ; 
} 

(參見jsFiddle

此外,推遲四捨五入顯示代碼非常重要。這樣你就不會在計算中引入不必要的錯誤。

+0

冷靜,我如何(我目前的代碼)可以得到正確的百分比。你的代碼(雖然很好),是矯枉過正的,我也不能真正使用Array的想法:'((+1給你) – 2011-02-24 11:55:55

1

你使用Math.ceil引入四捨五入的錯誤,首先就行了()。如果沒有理由首先湊到最近的一百,最好把它排除在外。 「真實」價值與您的計算之間可能存在顯着差異(取決於您計算的內容)。