Жестко закодированные 8191 10485 значений в функции округления JavaScript

Я видел следующую (причудливую) функцию округления Javascript в каком-то устаревшем коде. После поиска в Google я вижу, что он появляется в ряде мест в Интернете. Однако я не могу понять, почему присутствуют жестко закодированные значения 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;
}

2 ответа

Решение

8191 (0x1fff) может быть значимым с точки зрения двоичного представления, но 10485 (0x28f5), похоже, не так.

Могу поспорить, что это какой-то хак для обхода предполагаемой ошибки округления с плавающей запятой. Числа с плавающей запятой могут действовать непредсказуемым образом, где вы ожидаете 2, но вместо этого получаете, например, 1.99999999973904, и сравнения, такие как>= 2, не выполняются.

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, так что вы можете безопасно использовать его для округления целых чисел, я думаю.

Другие вопросы по тегам