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