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 に答える