2014-02-15 147 views
0

什麼是在javasript一輪商業的最佳方式?四捨五入數字

實施例:

0.145 -> ToString(2) -> 0.14 

mathjs: 
math.round(0.145, 2)) -> 0.14 

也數學POW圓不會致使工作100%

目前,我使用:

function number_format(number, decimals, dec_point, thousands_sep) { 
    number = number + 0.000000001; 
    number = (number + '').replace(/[^0-9+\-Ee.]/g, ''); 

    var n = !isFinite(+number) ? 0 : +number, 
     prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), 
     sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, 
     dec = (typeof dec_point  === 'undefined') ? '.' : dec_point, 
     s = '', 
     toFixedFix = function(n, prec) { 
         var k = Math.pow(10, prec); 
         return '' + Math.round(n * k)/k; 
        }; 

    // Fix for IE parseFloat(0.55).toFixed(0) = 0; 
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.'); 

    if (s[0].length > 3) 
    { 
     s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep); 
    } 

    if ((s[1] || '').length < prec) { 
    s[1] = s[1] || ''; 
    s[1] += new Array(prec - s[1].length + 1).join('0'); 
    } 

    return s.join(dec); 
} 

用此修復程序(數=數+ 0.000000001 ;) 我得到0.15

有沒有更好的辦法做到這一點?

+0

我認爲最好的辦法是將數字轉換爲字符串,然後查看您想要的舍入位置的數字,然後再手動應用舍入。我會很快發佈一個函數。 – RobG

+5

*「有沒有更好的方法來做到這一點?」*是的!不要使用花車進行貨幣計算。將價格保持在最低單位,例如美分。然後,當你想顯示在不同的單元數(例如歐元),你只需要除以100 –

+0

值可以有人開導我,在這個問題上的商業性一詞? –

回答

0

如果純粹是關於格式,可以使用專用的圖書館像accounting.js貨幣值不是很安全。

accounting.toFixed(0.615, 2); // "0.62" 

accounting.formatMoney(12345678); // $12,345,678.00 

accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99 
1

舍入你提到也被稱爲「銀行家舍入」,這裏如果一個數被四捨五入到n個數字,那麼如果第n + 1位是5的第n個數字四捨五入到最接近的偶數,

如四捨五入至2位:

2.345 => 2.34 
2.335 => 2.34 

下可以適應,這不是徹底的測試,並且對可以圓數字的大小限制,但它顯示的方法。它基於來修正所以返回一個字符串。

function bankersRound(n, d) { 
    var a, b; 
    var p = String(n).split('.'); 

    if (p[1]) { 
     a = p[1].substr(0, d); 
     b = p[1].substr(d, 1); 

     // If the d+1 character is 5 and the d character is even, force 
     // toFixed to round down 
     if (b == 5 && !(a%2)) { 
      n = p[0] + '.' + a + '4'; 
     } 
    } 
    return Number(n).toFixed(d); 
} 

console.log(bankersRound(23.365, 2)); // 23.36 
console.log(bankersRound(23.366, 2)); // 23.37 
console.log(bankersRound(23.355, 2)); // 23.36 
console.log(bankersRound(23.345, 2)); // 23.34 
console.log(bankersRound(23.335, 2)); // 23.34