функция округления javascript - PullRequest
       5

функция округления javascript

3 голосов
/ 02 августа 2011

Я хочу написать функцию, которая с заданным числом установит все, кроме первой цифры, в ноль и увеличит первую цифру на единицу

например, 175 должно стать 200, 23 должно стать 30 и т. Д. Каков наилучший способ сделать это?

Ответы [ 7 ]

3 голосов
/ 02 августа 2011
function truncUp(num) {
    var factor = Math.pow(10, (num+'').toString().length - 1);
    return Math.floor(num / factor) * factor + factor;
}

это было весело: D

А для неназванных "других":

function truncUp(num) {
    num = Math.floor(num);
    var factor = Math.pow(10, (Math.abs(num)+'').toString().length - 1);
    return Math.floor(num / factor) * factor + ((Math.abs(num) - num == 0?1:2)*factor);
}
1 голос
/ 02 августа 2011
function myRound(num)
{
    var digits = String(num).length - 1,
        pow = Math.pow(10, digits);
    num /= pow;
    num = Math.ceil(num);
    num *= pow;
    return num;
}

Короткая версия:

function myRound(num)
{
    var pow = Math.pow(10, String(num).length - 1);
    return Math.ceil(num/pow)*pow;
}

Тесты:

> myRound(175)
  200
> myRound(23)
  30
> myRound(95)
  100
0 голосов
/ 02 августа 2011
function A(a){var b=Math.abs(a);return((b+'')[0]/1+1)*Math.pow(10,(b+'').length-1)*(a<0?-1:1)}

Вот мой ответ, манипулирующий строкой.Он обрабатывает негативы, но я не уверен, как ОП хочет, чтобы негативы округлялись вверх / вниз.

0 голосов
/ 02 августа 2011

Большая часть ответов здесь использует строки. Как это будет обращаться с отрицательным числом? Числа с плавающей точкой? Мое решение использует только математические функции и работает для всех чисел (я думаю).

http://jsfiddle.net/xBVjB/7/

См. Ссылку на функцию и некоторые тестовые примеры:)

Приветствия

0 голосов
/ 02 августа 2011

Хорошо, еще один, используя магию Струн. Подобно ответу Джозефа, но вы избегаете использования любых операций с плавающей запятой (все еще не уверены, какая из них может быть более эффективной):

function roundUp(number)
{
    var numberStr = number.toString();
    var firstDigit = parseInt(numberStr.substring(0, 1)) + 1;
    return firstDigit * Math.pow(10, (numberStr.length - 1));
};
alert(roundUp(23));
0 голосов
/ 02 августа 2011

Если вы хотите манипулировать в десятичном формате, иногда лучший способ - просто обработать его как строку десятичных цифр.

function oneSignificantDigitAwayFromZero(n) {
   // Convert to a string of digits.
   var s = "" + n;
   // This regexp grabs any sign, and leading zeros in one group,
   // the digit to promote in another, and the trailing digits in a third.
   // This regexp is guaranteed not to accidentally grab any exponent.
   return s.replace(/^(-?[0.]*)([1-9])([0-9.]+)/, function (_, before, digit, after) {
     // Round the digit up if there is a non-zero digit after it,
     // so 201 -> 300, but 200 -> 200.
     var roundUp = /[1-9]/.test(after) ? +digit + 1 : +digit;
     // Replace all non-zero digits after the one we promote with zero.
     // If s is "201", then after is "01" before this and "00" after.
     after = after.replace(/[1-9]/g, "0");
     // If roundUp has no carry, then the result is simple.
     if (roundUp < 10) { return before + roundUp + after; }
     // Otherwise, we might have to put a dot between the 1 and 0 or consume a zero from
     // the fraction part to avoid accidentally dividing by 10. 
     return before.replace(/0?([.])?$/, "1$10") + after;
   });
}
0 голосов
/ 02 августа 2011

Делите число до тех пор, пока оно не станет меньше 10 (a.bcdefgh), запомните, сколько раз вы делили, Ceil, затем умножьте снова.

function superRoundUp(n) {
    i = 0;
    while (n > 10) {
        i++;
        n = n/10; 
    }
    n = Math.ceil(n);
    for ( ; i>0; i--) {
        n = n * 10;
    }
    return n;
}
var n = 57;
alert(superRoundUp(n));
...