Javascript интеллектуальное округление - PullRequest
7 голосов
/ 19 сентября 2011

Мне нужно округлить числа до ближайшего старшего числа. (Не уверен, что правильный термин здесь)

Но посмотрите пример того, чего я пытаюсь достичь

IE:

 13 // 20
 349 // 400
 5645 // 6000
 9892 // 10000
 13988 // 20000
 93456 // 100000
 231516 // 300000

etc. etc.

Я реализовал способ сделать это, но он настолько болезненный и обрабатывает только числа до миллиона, и если я хочу, чтобы он пошел выше, мне нужно добавить больше операторов if (да, посмотрите, как я это сделал: P im not not горд, но мозг застрял)

Должно быть, что-то уже есть, но Google не очень мне помогает, вероятно, из-за того, что я не знаю правильный термин для вида округления, который я хочу сделать

Ответы [ 4 ]

13 голосов
/ 19 сентября 2011
<script type="text/javascript">
    function intelliRound(num) {
        var len=(num+'').length;
        var fac=Math.pow(10,len-1);
        return Math.ceil(num/fac)*fac;
    }
    alert(intelliRound(13));
    alert(intelliRound(349));
    alert(intelliRound(5645));
    // ...
</script>

См. http://jsfiddle.net/fCLjp/

8 голосов
/ 19 сентября 2011

В одну сторону;

var a = [13, // 20
 349, // 400
 5645, // 6000
 9892, // 10000
 13988, // 20000
 93456, // 100000
 231516 // 300000
]

for (var i in a) {
    var num = a[i];
    var scale = Math.pow(10, Math.floor(Math.log(num) / Math.LN10));
    print([ num, Math.ceil(num / scale) * scale ])
}

13,20
349,400
5645,6000
9892,10000
13988,20000
93456,100000
231516,300000
1 голос
/ 19 сентября 2011

вы можете использовать функцию Math.ceil, как описано здесь:

javascript - потолок суммы в долларах

, чтобы получить правильные числа, вам придется разделить их на 10 (если они имеют 2 цифры), 100 (если они имеют 3 цифры) и т. Д. ...

0 голосов
/ 25 апреля 2017

Ответ от @ rabudde работает хорошо, но для тех, кому нужно обрабатывать отрицательные числа, вот обновленная версия:

function intelliRound(num) {
     var len = (num + '').length;
     var result = 0;
     if (num < 0) {
         var fac = Math.pow(10, len - 2); 
         result = Math.floor(num / fac) * fac;
     }
     else {
        var fac = Math.pow(10, len - 1);
        result = Math.ceil(num / fac) * fac;
     }
     return result;
}
alert(intelliRound(13));
alert(intelliRound(349));
alert(intelliRound(5645));
            
alert(intelliRound(-13));
alert(intelliRound(-349));
alert(intelliRound(-5645));
...