如何制作更好的findGoodMax功能?

时间:2013-11-13 23:30:08

标签: javascript

我有这个功能,我用它来为仪表找到一个很好的最大值。

function findGoodMax(x) {
  var y = Math.pow(10, x.toString().length - 1);
  x = (x/y);
  x = Math.ceil(x);
  x = x*y;
  return x || 10;
}

findGoodMax(33)   //=> 40
findGoodMax(76)   //=> 80
findGoodMax(543)  //=> 600
findGoodMax(1734) //=> 2000

问题是:

findGoodMax(0.1)      //=> 100
findGoodMax(0.00001)  //=> 1000000

如何修改我的函数以处理小数?

另外,我想

if (x > 10 && x < 100) {
  x = 100;
}

对于其他小数位数,基本上它应该舍入到最接近的10的幂。

处理负数也会很好,所以-0.1会输出0,-0.01会输出-0.1,至少我认为这是有意义的。

2 个答案:

答案 0 :(得分:4)

像这样的东西(小提琴:http://jsfiddle.net/wSkss/5/)?

var findGoodMax = function(num){
    var s = num.toExponential().split('e');    
    //console.log(s);
    var pow = parseInt(s[1]);
    var isNegative = s[0][0] === "-";
    if (isNegative) {                
        if (pow === 0 || pow === -1) {
            return 0;
        } else if (pow < 0) {
            pow += 1;
        }
        return -Math.pow(10, pow);
    } else {
        return Math.pow(10, pow + 1);
    }
}

test output: 

33 : 100 
76 : 100 
543 : 1000 
1734 : 10000 
-543 : -100 
-1734 : -1000 
-0.00001 : -0.0001 
0.00001 : 0.0001 
-0.1 : 0 
0 : 10 
1 : 10 
5 : 10 
-5 : 0 
-33 : -10 

答案 1 :(得分:0)

看到这个问题,我想我会抓住它。第一次尝试 - 我认为这是有效的,但它可能会被破坏(我不认为它现在处理非整数,将解决这个问题。)

function findGoodMax(x) {
  if (x < 0) return 0; // Negative numbers.
  if (x < 1) return 1; // Decimals between 0 and 1.

  var i = 1;

  while (x % (10 ^ i)) {
    i++;
  }

  var y = Math.pow(10, i);
  x = (x/y);
  x = Math.ceil(x);
  x = x*y;
  return x || 10;
}