Жестко закодированные 8191 10485 значений в функции округления JavaScript - PullRequest
6 голосов
/ 19 марта 2010

Я видел следующую (причудливую) функцию округления 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 ]

2 голосов
/ 19 марта 2010

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

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

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

...