计算一个百分比,有没有更优化的方法?

问题描述:

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

可能优化这个通过计算因子,直接扩展到百分比需要:

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

你使用Math.ceil引入四舍五入的错误,首先就行了()。如果没有理由首先凑到最近的一百,最好把它排除在外。 “真实”价值与您的计算之间可能存在显着差异(取决于您计算的内容)。