在JavaScript中舍入数字

时间:2014-02-15 09:26:00

标签: javascript rounding

在javasript进行商业广告的最佳方式是什么?

示例:

0.145 -> ToString(2) -> 0.14

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

也是圆形的数学战将不会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);
}

使用此修复程序(number = number + 0.000000001;) 我得到0.15

有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

你提到的舍入也称为“银行家舍入”,如果一个数字要四舍五入到n位,那么如果n + 1位是5,那么第n位将四舍五入到最接近的偶数,

e.g。四舍五入:

2.345 => 2.34
2.335 => 2.34

以下内容可能适用,未经过全面测试,并且对可以舍入的数字大小有限制,但它显示了一种方法。它基于 toFixed ,因此返回一个字符串。

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

答案 1 :(得分:0)

Math.round()将以整数为您完成工作。您可以通过将数字乘以10的幂,然后再舍入,然后除以相同的数字来做一个很好的方法。

@Example:十进制舍入
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round

和它们之间的基准。

http://jsperf.com/roundingnumbers2

所以我的方法比其他人快:),但对于非常大的数字来说不是很安全

答案 2 :(得分: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

答案 3 :(得分:0)

出于好奇,这是一种处理整数除法的技术,甚至舍入是Daniel LemireFalk Hüffner讨论的技术:

function roundToEven(n, d) {
  var off = (n + d / 2)
  var roundup = off / d;
  var ismultiple = ((off % d) == 0);
  return (d | (roundup ^ ismultiple)) & roundup;
}

Math.round(3/2);
2
roundToEven(3,2);
2

您可能会担心溢出。实际上,如果n和d都很大,则n + d / 2可能会超出允许范围。