JavaScript 舍入函数中硬编码 8191 10485 值

发布于 2024-08-25 14:43:30 字数 517 浏览 8 评论 0原文

我在一些遗留代码中看到了以下(奇怪的)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;
}

I've seen the following (bizarre) Javascript rounding function in some legacy code. After googling for it I can see that it crops up in a number of places online. However I can't work out why the hard-coded values 8191 and 10485 are present.

Does anyone know if there's any sensible reason why these values are included? If not, hopefully we can kill off the meme!

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

遇到 2024-09-01 14:43:30

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

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

8191 (0x1fff) could be significant in terms of binary representation, but 10485 (0x28f5) does not seem to be.

I'd bet this is some kind of hack to work around a perceived floating point rounding error. Floating point numbers can act in unpredictable ways, where you expect 2 but get 1.99999999973904 instead, for example, and comparisons such as >= 2 fail.

天煞孤星 2024-09-01 14:43:30
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,所以我猜你可以安全地使用它来舍入整数。

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

Are you sure this was meant for javascript?

If you have a number (n=10449.012345)

and you want to round it to 5 decimals (dec=5),
Math.round(n*Math.pow(10, dec))/Math.pow(10, dec)
returns 10449.01234.

Using roundNumber(10449.012345,5)
returns 10449.012340000001,
which does not seem to be an improvement.
10000.12 returned 10000.119999999999.

All of the non integer numbers I tried in the 8191-10485 range failed.

10000 did return 10000, so you can safely use it to round integers, I guess.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文