6

我在一些遗留代码中看到了以下(奇怪的)Javascript 舍入函数。在谷歌搜索之后,我可以看到它出现在网上的许多地方。但是我无法弄清楚为什么存在硬编码值 8191 和 10485 。

有谁知道包含这些值是否有任何合理的理由?如果没有,希望我们能杀死模因!

function roundNumber(num,dec) {
    var newnumber = 0;
    if (num > 8191 && num < 10485) {
        num = num-5000;
        newnumber = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
        newnumber = newnumber+5000;
    } else {
        newnumber = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
    }
    return newnumber;
}
4

2 回答 2

2

8191 (0x1fff) 在二进制表示方面可能很重要,但 10485 (0x28f5) 似乎并不重要。

我敢打赌,这是一种解决感知浮点舍入错误的技巧。浮点数可能会以不可预知的方式起作用,例如,您期望 2 但得到 1.99999999973904,而 >= 2 等比较失败。

于 2010-03-19T15:07:04.723 回答
1
function roundNumber(num, dec){
 var newnumber= 0;
 if(num> 8191 && num < 10485){
  num= num-5000;
  newnumber= Math.round(num*Math.pow(10, dec))/Math.pow(10, dec);
  newnumber= newnumber+5000;
 }
 else{
  newnumber= Math.round(num*Math.pow(10, dec))/Math.pow(10, dec);
 }
 return newnumber;
}

你确定这是为 javascript 设计的吗?

如果你有一个数字 (n=10449.012345)

并且您想将其四舍五入到小数点后 5 (dec=5),Math.round(n*Math.pow(10, dec))/Math.pow(10, dec) 返回 10449.01234。

使用 roundNumber(10449.012345,5) 返回 10449.012340000001,这似乎不是一个改进。10000.12 返回 10000.119999999999。

我在 8191-10485 范围内尝试的所有非整数都失败了。

10000 确实返回了 10000,所以我猜你可以安全地使用它来舍入整数。

于 2010-03-19T16:17:45.637 回答