2013-03-11 93 views
0

我嘗試使用這樣的:的Javascript四捨五入問題

//var value = "39.99"; 
//var value = "0.255"; 
var list = ["39.99", "0.255", "0.306", "0.645", "2.505", "5.726", "9.649", "9.999", "10.01", "0.155", "0.355", "10.05", "14.75", "14.02", "2.405", "14.54","2.485"]; 


var result; 

for(i in list){ 
    //result = processRounding(parseFloat(list[i]).toFixed(3)); 
    //result = parseFloat(list[i]).toFixed(2); 
    result = test(parseFloat(list[i]).toFixed(3), 2); 
    console.log("RESULT["+i+"]: "+ format("#,##0.00", result)); 
} 

function test(value, precision) { 
    var precision = precision || 0, 
    neg = value < 0, 
    power = Math.pow(10, precision), 
    value = Math.round(value * power), 
    integral = String((neg ? Math.ceil : Math.floor)(value/power)), 
    fraction = String((neg ? -value : value) % power), 
    padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0'); 

    return precision ? integral + '.' + padding + fraction : integral; 
} 


function processRounding (value){ 
    //console.log(Math.ceil(value*100) + " " + Math.ceil(value*100)/2); 
    var remainder = parseFloat(value % 1).toFixed(2); 
    var floor  = parseInt(Math.floor(value)); 
    console.log(floor + " " + remainder); 
    if(Math.floor(value) != 0 && Math.floor(value) > 10){ 
     if(parseFloat(remainder) > 0.50 || parseFloat(remainder) > 0.05){ 
      console.log("CEIL"); 
      value = Math.ceil(value*10)/10; 
     }else{ 
      value = value; 
     }   
    }else{ 
     if(parseFloat(remainder) > 0.50 || parseFloat(remainder) > 0.05){ 
      console.log("ROUND"); 
      value = Math.round(value*100)/100; 
     }else{ 
      value = value; 
     } 
    } 

    return value; 
} 

[jsFiddle here]

但我看到的問題是,當值是一樣的東西"2.405"它的作用很簡單使其「2.40」不管如果我在我的jsfiddle示例中使用功能test或功能processRounding

任何關於如何將結果變成2.41的想法?從技術上說,它應該從最後一位數字是「5」開始正確。

RESULT[0]: 39.99 
RESULT[1]: 0.26 
RESULT[2]: 0.31 
RESULT[3]: 0.65 
RESULT[4]: 2.51 
RESULT[5]: 5.73 
RESULT[6]: 9.65 
RESULT[7]: 10.00 
RESULT[8]: 10.01 
RESULT[9]: 0.16 
RESULT[10]: 0.36 
RESULT[11]: 10.05 
RESULT[12]: 14.75 
RESULT[13]: 14.02 
RESULT[14]: 2.40 
RESULT[15]: 14.54 
RESULT[16]: 2.49 

注意,在列表中有一個 「2.405」 的值,其結果中的[14:

使用result = test(parseFloat(list[i]).toFixed(3), 2);

var list = ["39.99", "0.255", "0.306", "0.645", "2.505", "5.726", "9.649", "9.999", "10.01", "0.155", "0.355", "10.05", "14.75", "14.02", "2.405", "14.54","2.485"]; 

將導致該UPDATE

]它是「2.40」它應該在2.41是嗎?

+1

在那小提琴裏有很多事情要做。你能在這裏發佈相關部分嗎? – 2013-03-11 02:09:36

回答

3

我想你想在JavaScript中有一個四捨五入的功能。

function trueRound(value, digits){ 
    return (Math.round((value*Math.pow(10,digits)).toFixed(digits-1))/Math.pow(10,digits)).toFixed(digits); 
} 

可能重複的問題:round off decimal using javascript

+0

好吧,它確實工作。但我的問題是價值39.99應該四捨五入到40的權利呢? – jongbanaag 2013-03-11 02:19:20

+0

要將數字舍入爲最接近的整數:'Math.round(x)' – 2013-03-11 02:22:08

+0

僅供參考,請參閱http://www.w3schools.com/jsref/jsref_round.asp – 2013-03-11 02:23:31

0

你被切割掉剩餘2位小數出發:parseFloat(value % 1).toFixed(2);

這意味着,當你有2.405其餘被解析爲.40和它贏得無法區分2.400和2.409之間

如果您想正確舍入,您將需要保留全部餘數。

Roger Ng有一個很好的解決方案。我只想解釋爲什麼你從一開始就沒有機會工作。

+0

我也嘗試過使用toFixed(3 )能夠檢索.405,但結果相同。 – jongbanaag 2013-03-11 02:16:35