Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hard-coded 8191 10485 values in JavaScript rounding function

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;
}
like image 406
Matthew Hegarty Avatar asked Mar 19 '10 15:03

Matthew Hegarty


2 Answers

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.

like image 105
tadman Avatar answered Oct 13 '22 12:10

tadman


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.

like image 24
kennebec Avatar answered Oct 13 '22 10:10

kennebec