2011-09-19 20 views
7

Obecnie potrzebuję zaokrąglić liczby do najbliższej liczby głównej. (Nie wiem co prawda termin jest tutaj)JavaScript inteligentne zaokrąglanie

Ale patrz przykład co usiłuję osiągnąć

IE: 

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

etc. etc. 

I wdrożyliśmy sposób robienia tego, ale jej tak bolesne i zajmuje się tylko numery górę do miliona, a jeśli chcę, żeby był wyższy, muszę dodać więcej, jeśli oświadczenia (tak, zobaczę, jak je wpleciono: P nie jest bardzo dumny, ale mózg utknął)

Coś tam musi być, ale google nie pomaga mi bardzo prawdopodobnie dlatego, że nie znam prawidłowego terminu dla tego rodzaju zaokrąglania Chcę zrobić

+0

I muszę dziewczynę, ale może mamy do pracy aby wszystko załatwić! Jaka jest logika, aby 349-> 400 zamiast 500, 13988-> 20000, zamiast 15000, 231516-> 300000 zamiast 250000?!? – Bakudan

+1

@Bakudan Istnieje logika do przykładów, które opublikował Tristan. Zasadniczo uprościsz liczbę do 1 cyfry znaczącej, zawsze zaokrąglając w górę. – cheeken

+0

@cheeken to lepszy termin niż to, czego użyłem! Znacząca cyfra – Tristan

Odpowiedz

13
<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> 

Zobacz http://jsfiddle.net/fCLjp/

+0

Elegancko proste! Mój mózg nie działał źle! Patrzenie na to sprawia, że ​​zastanawiam się, jak to przegapiłem! – Tristan

7

jeden sposób;

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 
0

The answer from @rabudde działa dobrze, ale dla tych, które trzeba obsłużyć liczb ujemnych, tu jest zaktualizowana wersja:

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));