簡體   English   中英

javascript中的四舍五入數字

[英]Rounding numbers in javascript

在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);
}

有了這個修復(數字 = 數字 + 0.000000001;)我得到 0.15

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

您提到的四舍五入也稱為“銀行家的四舍五入”,如果一個數字要四舍五入到 n 位,那么如果 n+1 位是 5,則第 n 位將四舍五入到最接近的偶數,

例如四舍五入到 2 個位置:

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

Math.round()將以整數為您完成這項工作。 您可以通過將您的數字乘以 10 的冪,然后舍入,然后除以相同的數字來做一個很好的方法。

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

以及它們之間的基准。

http://jsperf.com/roundingnumbers2

所以我的方法比其他方法快 :),但對於非常大的數字不是很安全

如果純粹是關於格式化貨幣值,您可以使用專用庫,如accounting.js

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

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

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

出於好奇,這里有一種處理整數除法的技術,甚至舍入是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 可能會超出允許范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM