Я видел, что следующий (причудливый) 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;
}
8191 (0x1fff) может иметь значение с точки зрения двоичного представления, но 10485 (0x28f5), похоже, не имеет значения.
Могу поспорить, что это своего рода прием, позволяющий обойти предполагаемую ошибку округления с плавающей запятой. Числа с плавающей запятой могут действовать непредсказуемым образом: вы ожидаете 2, но вместо этого получаете 1,999999999973904, а сравнения, такие как> = 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.
Using roundNumber(10449.012345,5) возвращает 10449.012340000001, что не кажется улучшением. 10000.12 возвращает 10000.119999999999.
Все нецелые числа, которые я пробовал в диапазоне 8191-10485, не дали результата.
10000 вернуло 10000, так что можно смело использовать его для округления целых чисел, я думаю.