2011-09-19 25 views
7

Şu anda en yakın ana numaraya kadar numara çevirmem gerekiyor.Javascript akıllı yuvarlama

(Emin değil doğru terim burada neler olduğunu) Ama bu ancak onun kadar acı verici ve sadece kolları numaraları yapmanın bir yolunu uygulamış

IE: 

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

etc. etc. 

ulaşmak istediğim şey bir örnek görmek bir milyona kadar ve eğer daha yüksek gitmek istiyorsam, ifadeler eklediğimde daha fazla eklemem gerekiyor (evet, nasıl itiraf ettiğimi görüyorum: P im çok gurur duymuyor, ama beyin sıkışmış durumda)

Orada bir şey olmalı ama google muhtemelen bana çok yardımcı olmuyor çünkü benim için doğru terimi bilmemek istiyorum

Burada açıklandığı gibi
+0

Ve ben bir kız arkadaşı gerekir, ama biz çalışmak zorunda kalabilirsiniz İşleri halletmek için! Mantık, 250000 yerine 349-> 400 yerine, 15000, 231516-> 300000 yerine 13988-> 20000,> 300000 yerine? – Bakudan

+1

@Bakudan Tristan'ın gönderdiği örneklerin bir mantığı var. Temel olarak, sayıyı her zaman yuvarlanan 1 anlamlı basamağa basitleştirirsiniz. – cheeken

+0

@cheeken daha iyi bir terimdir, sonra ne kullandım! Anlamlı rakam – Tristan

cevap

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> 

http://jsfiddle.net/fCLjp/

+0

Zarif basit! Beynim kötü çalışmıyordu! Sadece şuna bakmak bana bunu nasıl özlediğimi merak ediyor! – Tristan

7

Tek yön bakın;

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 iyi çalışıyor, ancak negatif sayılar işlemek için ihtiyacı olanlar için, buraya güncelleştirilmiş bir sürümü:

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