Как округлить число до ближайших 100/1000 в зависимости от числа в JavaScript?

У меня есть номер, который может быть двухзначным, например 67, 24, 82, или трехзначным, например 556, 955, 865, или четырехзначным и так далее. Как я могу округлить число до ближайших n + 1 цифр в зависимости от числа?

Пример:

roundup(87) => 100,
roundup(776) => 1000,
roudnup(2333) => 10000

и так далее.


person mikasa    schedule 04.07.2018    source источник
comment
Возможный дубликат Округление до ближайших 100   -  person Elydasian    schedule 04.07.2018
comment
каково желаемое поведение для самой 10? 10 или 100? Ответы ниже отличаются по этому поводу.   -  person Jeremy Kahan    schedule 04.07.2018
comment
@JeremyKahan это обзор, так что ответ должен быть 100.   -  person mikasa    schedule 04.07.2018
comment
Так что просто знайте, что первая версия принятого ответа дает 10, когда вы кормите его 10 (вторая дает 100)   -  person Jeremy Kahan    schedule 05.07.2018


Ответы (5)


Вы можете взять логарифм десяти и округлить значение для получения значения.

function roundup(v) {
    return Math.pow(10, Math.ceil(Math.log10(v)));
}

console.log(roundup(87));   //   100
console.log(roundup(776));  //  1000
console.log(roundup(2333)); // 10000

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

function roundup(v) {
    return (v >= 0 || -1) * Math.pow(10, 1 + Math.floor(Math.log10(Math.abs(v))));
}

console.log(roundup(87));    //    100
console.log(roundup(-87));   //   -100
console.log(roundup(776));   //   1000
console.log(roundup(-776));  //  -1000
console.log(roundup(2333));  //  10000
console.log(roundup(-2333)); // -10000

person Nina Scholz    schedule 04.07.2018
comment
(v >= 0 || -1) это была причина, по которой я проголосовал ... и, вероятно, это нужно объяснить другим посетителям ... - person Jonas Wilms; 04.07.2018
comment
Мне кажется интересным, что эти две реализации расходятся во мнениях относительно того, что делать с 1, 10, 100, ... Мне нравится использовать только математику для математической функции. Насколько круто то, что логарифм 0 дает -бесконечность и увеличение 10 до этого работает? - person Jeremy Kahan; 05.07.2018

 const roundup = n => 10 ** ("" + n).length

Просто используйте количество символов.

person Jonas Wilms    schedule 04.07.2018
comment
Я не буду знать количество символов заранее. - person mikasa; 04.07.2018
comment
@ eren555, но вы можете легко получить это, превратив число (n) в строку ("" + n), а затем получив ее длину - person Jonas Wilms; 04.07.2018

Вы можете проверить, сколько цифр в числе, и использовать возведение в степень:

const roundup = num => 10 ** String(num).length;
console.log(roundup(87));
console.log(roundup(776));
console.log(roundup(2333));

person CertainPerformance    schedule 04.07.2018

Вы можете использовать String#repeat в сочетании с Number#toString для достижения этого:

const roundUp = number => +('1'+'0'.repeat(number.toString().length));

console.log(roundUp(30));
console.log(roundUp(300));
console.log(roundUp(3000));

person Zenoo    schedule 04.07.2018

//Math.pow(10,(value+"").length)   


console.log(Math.pow(10,(525+"").length))
console.log(Math.pow(10,(5255+"").length))

Я придумал другое решение, которое не требует создания новой функции.

person Bilal Alam    schedule 04.07.2018