Javascript智能舍入

时间:2011-09-19 11:08:12

标签: javascript math rounding

我目前需要将数字舍入到最接近的主要数字。 (不确定这里的正确用语是什么)

但请看一个我想要实现的例子

IE:

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

etc. etc.

我已经实现了这样做的方法,但它非常痛苦,只处理数百万,如果我想要它更高,我需要添加更多的if语句(是的,我知道如何实现它:P im not very very自豪,但大脑被卡住了)

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

5 个答案:

答案 0 :(得分: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/

答案 1 :(得分:8)

单向;

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

答案 2 :(得分:1)

您可以使用Math.ceil函数,如下所述:

javascript - ceiling of a dollar amount

为了使你的数字正确,你必须将它们除以10(如果它们有2位数),100(如果它们有3位数),依此类推......

答案 3 :(得分:0)

The answer from @rabudde效果很好,但对于那些需要处理负数的人来说,这里有更新版本:

&#13;
&#13;
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));
&#13;
&#13;
&#13;

答案 4 :(得分:0)

其他答案中的intelliRound函数效果很好,但是我需要支持小数(例如0.123,-0.987)和非数字,因此请使用此函数:

/**
 * Function that returns the floor/ceil of a number, to an appropriate magnitude
 * @param {number} num - the number you want to round
 *
 * e.g.
 * magnitudeRound(0.13) => 1
 * magnitudeRound(13) => 20
 * magnitudeRound(349) => 400
 * magnitudeRound(9645) => 10000
 * magnitudeRound(-3645) => -4000
 * magnitudeRound(-149) => -200
 */

function magnitudeRound(num) {
  const isValidNumber = typeof num === 'number' && !Number.isNaN(num);
  const result = 0;

  if (!isValidNumber || num === 0) return result;
  const abs = Math.abs(num);
  const sign = Math.sign(num);

  if (abs > 0 && abs <= 1) return 1 * sign; // percentages on a scale -1 to 1
  if (abs > 1 && abs <= 10) return 10 * sign;
  const zeroes = `${Math.round(abs)}`.length - 1; // e.g 123 => 2, 4567 => 3
  const exponent = 10 ** zeroes; // math floor and ceil only work on integer
  const roundingDirection = sign < 0 ? 'floor' : 'ceil';

  return Math[roundingDirection](num / exponent) * exponent;
}