首页 > 解决方案 > 如何将 javascript 函数舍入为 1.00 而不是 0.100?

问题描述

我有一个函数formatMoney可以将数字转换为接近完美的数千个分隔字符串。我今天刚刚注意到,一旦输入数字为 x.995xxx,它就很难正确舍入。然后舍入到 0.1000 而不是 1.0000。

有任何解决这个问题的方法吗?几周前,我从 SO 线程中复制了以下函数,但再也找不到了。

n1 = 0.9940
n2 = 0.9950

$('#n1').html(formatMoney(n1, 2))
$('#n2').html(formatMoney(n2, 2))

function formatMoney(n, dp){

  var s = ''+(Math.floor(n)), d = n % 1, i = s.length, r = '';
  while ( (i -= 3) > 0 ) { r = '.' + s.substr(i, 3) + r; }
  return s.substr(0, i + 3) + r +
    (d ? ',' + Math.round(d * Math.pow(10, dp || 2)) : '');
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
  <html>
  
    <p> Correct Output: </p>

    <div id="n1">0,9900</div>

     <p> Current wrong output: </p> 

    <div id="n2">0,1000</div>

     <p> Desired output: </p> 

    <div>1,0000</div>

  </html>
</body>

在此处输入图像描述

标签: javascript

解决方案


试试下面的方法。

function formatMoney(n, digits){
        var negative = false;
        if (digits === undefined) {
            digits = 0;
        }

        if( n < 0) {
            negative = true;
          n = n * -1;
        }

        var multiplicator = Math.pow(10, digits);
        n = parseFloat((n * multiplicator).toFixed(11));
        n = (Math.round(n) / multiplicator).toFixed(digits);
        if( negative ) {    
            n = (n * -1).toFixed(2);
        }
        //return n;
        var  mystring = n.toString().replace(/\B(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ",");
        mystring = mystring.replace(/[,.]/g, m => (m === ',' ? '.' : ','))
        return mystring;
    };

推荐阅读