2010-11-27 19 views
0

幾天前,我開始了一個項目,在這個項目中我需要做一些度量計算;具體爲:統計計算。那麼,這不是問題,問題出現在舍入浮動數字(帶小數的數字)以及JavaScript處理它的方式。我在網上找到了一些四捨五入的javascript數字方法,但沒有一個是ms excel功能(ROUND.MAX功能)的絕佳替代方案。所以我必須自己重新創建這個函數行爲。所以這是代碼:作爲微軟Excel的RoundUP函數,在Javascript中使用

MathExt = { 

init: function(options){ 
    this.separator = options.separator || ","; 
}, 

roundMax: function(number, decimals){ 
    var $_indexOf = number.lastIndexOf(this.separator); 
    var fp = number.substring(0, $_indexOf); 
    var rp = number.substr($_indexOf + 1); 
    var roundedNumber = ""; 
    if(decimals > 0){ 
    var i = 0; 
    var _pq = 0; 
    var _zeros = ""; 

    while(rp.substr(i++, 1) == "0"){ _zeros += "0"; } 

    i = rp.length - 1; 
    while(i >= decimals){ 
    var _t = rp.charAt(i); 
    rp = rp.substring(0, i); 
    if(_t != "0"){ 
    if(rp.charAt(i - 1) == "9"){ _pq = 1; } 
    else{ 
     if(_pq == 1) _pq = 0; 
     rp = _zeros + (parseInt(rp, 10) + 1) + ""; 
     if(i == _zeros.length) _zeros = _zeros.substr(0, i - 1); 
    } 
    } 
    i--; 
    } 
    if(_pq == 0) 
    roundedNumber = fp + this.separator + rp; 
    else 
    if(i == 0){ 
    roundedNumber = "" + (parseInt(fp) + 1); 
    } 
    else{ 
    rp = (parseInt(rp) + 1) + ""; 
    i = rp.length - 1; 
    while(i > 0 && rp.substr(i, 1) == "0") rp = rp.substr(0, i); 
    roundedNumber = fp + this.separator + rp; 
    } 
    } 
    else{ 
    var _s = rp.substring(0, 1); 
    if(_s != "0") fp = "" + (parseInt(fp) + 1); 
    roundedNumber = fp; 
    } 
    return roundedNumber; 
} 
}; 

嗯,這段代碼的工作原理是我用javascript編號。但Surpringly JavaScript截斷長浮動數字。 接下來是做同樣的事情,但真的很長。昨天有人給了我一個我覺得很有用的鏈接,但是。我想知道這個函數(來自EXCEL的ROUND.MAX)是否已經用於這種大浮點數。

這是一個例子:

piii = 3.14159141597; for(var i = 0; i <= 11; i++){ console.log((Math.round((piii*Math.pow(10, i)))/Math.pow(10,i))); } extracted this from internet. 
3 
3.1 
3.14 
3.142 
3.1416 
3.14159 
3.141591 
3.1415914 
3.14159142 
3.141591416 
3.141591416 
3.14159141597 

MS Excel ROUND.MAX FUNCTION 
4 
3,2 
3,15 
3,142 
3,1416 
3,1416 
3,141592 
3,1415915 
3,14159142 
3,141591416 
3,141591416 
3,14159141597 

My first version of the ROUND.MAX algorithm 
4 
3.2 
3.15 
3.142 
3.1416 
3.1416 
3.141592 
3.1415915 
3.14159142 
3.141591416 
3.141591416 
3.14159141597 
+1

你是代表數字作爲字符串? – thejh 2010-11-27 16:46:26

+0

那麼,原則上,所有的數據都存儲在SQLServer中,並且存儲信息的字段是文本。所以,輸入是文字,對。 – crsuarezf 2010-11-27 17:03:49

回答

1

只需更換roundceil在你的榜樣,以獲得roundmax效果:

piii = 3.14159141597; 
for(var i = 0; i <= 11; i++) { 
    console.log((Math.ceil((piii*Math.pow(10, i)))/Math.pow(10,i))); 
} 

輸出:

4 
3.2 
3.15 
3.142 
3.1416 
3.1416 
3.141592 
3.1415915 
3.14159142 
3.141591416 
3.141591416 
3.14159141597