Трудно кодированный 8191 10 485 значений в функции округления 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;
}
6
задан Dancrumb 19 March 2010 в 15:21
поделиться

2 ответа

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

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

2
ответ дан 17 December 2019 в 18:13
поделиться
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.

Using roundNumber(10449.012345,5) возвращает 10449.012340000001, что не кажется улучшением. 10000.12 возвращает 10000.119999999999.

Все нецелые числа, которые я пробовал в диапазоне 8191-10485, не дали результата.

10000 вернуло 10000, так что можно смело использовать его для округления целых чисел, я думаю.

1
ответ дан 17 December 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: