【问题标题】:formatting number with exactly two decimals issue格式化数字正好有两位小数问题
【发布时间】:2015-08-15 00:41:23
【问题描述】:

我遇到了一个问题,如果有人解释我的功能出了什么问题,我会很高兴。

请看下面的代码:

如果我运行 => number(10000.88, 2)

谁能解释一下为什么要输出 10000.87 而不是 10000.88

如果我在哪里运行 number(11111.88, 2) 输出是正确的 11111.88 所有其他输出都是正确的。

function number(value, decPos) {
        
  return Math.floor(Math.abs(value) * Math.pow(10, decPos)) / Math.pow(10, decPos);
       
}

document.write("<div>" + number(10, 2) + '</div>');
document.write("<div>" + number(10.8888, 2) + '</div>');
document.write("<div>" + number(100.8888, 2) + '</div>');
document.write("<div>" + number(1000.88, 2) + '</div>');
document.write("<div>" + number(10000.888, 2) + '</div>');
// magic
document.write("<div>" + number(10000.88, 2) + '</div>');

document.write("<div>" + number(100000.8888, 2) + '</div>');

// magic
document.write("<div>" + number(8368.88, 2) + '</div>');

document.write("<div>" + number(11111.8888, 2) + '</div>');
document.write("<div>" + number(11111.88, 2) + '</div>');
&lt;div id="result"&gt;&lt;/div&gt;

【问题讨论】:

  • 你知道有 toFixed() 吗?
  • Is floating point math broken? 的可能重复项
  • 使用 toFixed 不会解决我的问题,因为数字不仅可以有 2 个小数点,例如 (1111.88787).toFixed(2) 将等于 1111.89
  • 我删除了Math.floor(,这适用于第一个舍入错误,因为它正在删除小数,10000.88 * 100 返回1000087.999999 而不是预期的1000088

标签: javascript math


【解决方案1】:

这是一个舍入误差,使用双精度或浮点数无法保证准确性。

【讨论】:

    【解决方案2】:

    这不是四舍五入的工作原理,你会得到不准确的数字。

    但如果你必须:

    function subdec(value, decimals)
    {
        decimals = decimals || 2;
        var parts = value.toString().split('.');
    
        if (parts[1]) {
            parts[1] = parts[1].substr(0, decimals);
            return parseFloat(parts.join('.'));
        }
    
        return value;
    }
    

    将对该函数的调用添加到您的number () 函数中。

    【讨论】:

      【解决方案3】:

      您可以使用此函数生成预期结果。

      function number(value, decPos) { 
          str = String(value).split(".");
          if (str[1]) {
              return str[0]+"."+str[1].substring(0, decPos);
          }
          return str[0];
      }
      

      【讨论】:

        【解决方案4】:

        我稍微调整了您的代码以利用.toFixed() 函数。我这样做是为了让decPos 也确定.toFixed() 将截断多少小数位。这是您正在寻找的功能吗?

        function number(value, decPos) {
                
          return Math.floor((Math.abs(value) * Math.pow(10, decPos)).toFixed(decPos)) / Math.pow(10, decPos);
               
        }
        
        document.write("<div>" + number(10, 2) + '</div>');
        document.write("<div>" + number(10.8888, 2) + '</div>');
        document.write("<div>" + number(100.8888, 2) + '</div>');
        document.write("<div>" + number(1000.88, 2) + '</div>');
        document.write("<div>" + number(10000.888, 2) + '</div>');
        // magic
        document.write("<div>" + number(10000.88, 2) + '</div>');
        
        document.write("<div>" + number(100000.8888, 2) + '</div>');
        
        // magic
        document.write("<div>" + number(8368.88, 2) + '</div>');
        
        document.write("<div>" + number(11111.8888, 2) + '</div>');
        document.write("<div>" + number(11111.88, 2) + '</div>');
        document.write("<div>" + number(10000.888, 3) + '</div>');
        // magic
        document.write("<div>" + number(10000.88, 3) + '</div>');
        &lt;div id="result"&gt;&lt;/div&gt;

        【讨论】:

          猜你喜欢
          • 2010-12-16
          • 2011-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多