【问题标题】:Rounding issue in Math.round() & .toFixed()Math.round() 和 .toFixed() 中的舍入问题
【发布时间】:2013-12-20 10:04:46
【问题描述】:

我使用了以下两种方法:

Number.prototype.myRound = function (decimalPlaces) {
    var multiplier = Math.pow(10, decimalPlaces);

    return (Math.round(this * multiplier) / multiplier);
};
alert((239.525).myRound(2));

数学上的警报应该是239.53,但它给出239.52作为输出。 所以我尝试使用.toFixed() 函数,我得到了正确的答案。

但是当我尝试得到239.575 的答案时,它又给出了错误的输出。

alert((239.575).toFixed(2));

这里的输出应该是239.58,而不是给出239.57

此错误会在最终输出中产生一点差异。那么谁能帮我解决这个问题?

【问题讨论】:

  • 有趣但 239.375.toFixed(2) 在 Chrome 31 (Mac) 中返回 "239.38"... :)
  • broken toFixed implementation 的可能重复项
  • @VisioN 不在这里。您使用的是哪个浏览器?我在 Ubuntu 上使用最新的 FF。
  • @CedricReichenbach MacOS 上的 Chrome 31
  • 更简单的解决方案:Truncate to decimals function

标签: javascript jquery


【解决方案1】:

这种方法会给出非常正确的结果。

function RoundNum(num, length) { 
    var number = Math.round(num * Math.pow(10, length)) / Math.pow(10, length);
    return number;
}

只需调用此方法即可。

alert(RoundNum(192.168,2));

【讨论】:

【解决方案2】:

在内部,无法准确表示 239.575。在二进制中,0.575 类似于 1/2 + 1/16 + 1/128 + 1/256 + ....

碰巧,以二进制表示,结果小于 239.575。因此,Math.round 向下舍入。

为了演示,试试这个:

alert(239.575 - 239.5)

您会期望结果为 0.075,但实际上您得到的是 0.07499999999998863。

【讨论】:

  • 虽然是真的,但在其他语言中我还没有见过这样的'问题'……这绝对是JavaScript中必须改进的地方。
  • @VisioN 任何使用双精度浮点数的语言都是如此。几乎所有这些,除了那些具有定点或任意精度系统的系统。
【解决方案3】:

只需使用Math.round

function round(figureToRound){
    var roundOff = Math.round((figureToRound* 100 ).toFixed(2))/100;
    return roundOff;
}

console.log(round(1.005));

这将完全有助于四舍五入的问题。

【讨论】:

  • 适用于我的所有情况。回合(239.575 - 239.5) 0.08 回合(239.575) 239.58 回合(239.525) 239.53 回合(1.005) 1.01
  • 不适用于回合(0.07499)。它返回 0.08,而不是 0.07
【解决方案4】:

round() 可以解决问题。试试这个:

var v= Math.round(239.575 * 100) / 100;
alert(v);

Working FIddle

【讨论】:

    【解决方案5】:

    问题可能是浮点数不准确,因此您可能会在不同情况下得到不同的结果(数字的不同收集,不同的浏览器等)。

    另请参阅:toFixed(2) rounds "x.525" inconsistently?

    【讨论】:

      【解决方案6】:

      在我的软件中我使用这个:

      (需要DecimalJS

      Number.prototype.toFixed = function(fixed) {
          return (new Decimal(Number(this))).toFixed(parseFloat(fixed) || 
      0);
      };
      
      
      var x = 1.005;
      console.log( x.toFixed(2) ); //1.01
      

      【讨论】:

        【解决方案7】:
        function bestRound(val, decimals){
            decimals = decimals || 2;
            var multiplier = Math.pow(10, decimals)
            return Math.round((val * multiplier ).toFixed(decimals)) / multiplier;
          }
        
        bestRound(239.575 - 239.5)   0.08
        bestRound(239.575)         239.58
        bestRound(239.525)         239.53
        bestRound(1.005)             1.01
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多