2011-09-19 86 views
7

我目前需要将数字舍入到最近的主号码。 (不知道什么是正确的术语在这里)Javascript智能舍入

但看到我想要实现

IE: 

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

etc. etc. 

我已经实现了这样做,但它的如此痛苦,只处理了数字的方法的例子如果我想要它走得更高,我需要添加更多的if语句(是啊,看看我是如何使它:P我不是很自豪,但大脑被卡住)

必须有一些东西已经有,但谷歌对我的帮助并不大,可能是因为我不知道我想要做的那种四舍五入的正确术语

+0

我需要一个女朋友,但我们不得不工作把事情做完!什么是逻辑有349-> 400而不是500,13988-> 20000,而不是15000,231516-> 300000而不是250000?!? – Bakudan

+1

@Bakudan特里斯坦发布的例子有一个逻辑。本质上,你将数字简化为1位有效数字,总是四舍五入。 – cheeken

+0

@cheeken多数民众赞成在一个更好的术语,然后我用了!有意思的数字 – Tristan

回答

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

优雅简单!我的大脑不工作不好!只是看着这让我想知道我是如何错过这个的! – Tristan

7

的一种方式;

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效果很好,但对于那些需要处理负数,这里是一个更新版本:

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