重构这个基本代码,确定数字是否为数十,数百,数千等

时间:2011-07-14 16:13:09

标签: javascript refactoring

 if (n<100) {
     x = 10;
 } else if (n<1000) {
     x = 100;
 } else if (n<10000) {
     x = 1000;
 } else if (n....

等。等。

对于这类问题,是否有一个简洁,可扩展的方法?我的大脑决定停止工作。

5 个答案:

答案 0 :(得分:7)

var x = Math.pow( 10, Math.floor( Math.log(n) / Math.log(10) ) );

这个可能更好,因为它可以作为常量使用,因此不需要每次都计算:

var x = Math.pow( 10, Math.floor( Math.log(n) / Math.LN10 ) );

它基本上归结为以对数方式向下舍入。


修改:由于log/的组合往往会导致错误,因此最好也可以对商进行舍入(目前,{ {1}})。

Math.log(1000) / Math.LN10 === 2.9999999999999996

这种舍入可能会导致新的错误,但对于“正常”输入,现在答案通常是正确的。

答案 1 :(得分:2)

这是使用递归的解决方案:

function find_place( x, n ) {
    return x >= 10 ? find_place( x/10, ++n || 1  ) : Math.pow( 10, n || 0 );
}

find_place( 3 );    // 1
find_place( 33 );   // 10
find_place( 333 );  // 100

编辑: 已修复使用x >= 10代替x > 10


这是一个不再需要Math.pow()的版本。

function find_place(x, n) {
    return x >= 10 ? find_place(x / 10, (n || 1) * 10) : n || 1;
}

或者在循环中有效地运行相同的代码而不是递归函数来加快它的速度。

var x = 12345,
    n = 1;   // n will hold the result
while (x >= 10) {
  x /= 10;
  n *= 10;
}

答案 2 :(得分:1)

你可以尝试

x=Math.pow(10, Math.floor(Math.log(n)/Math.LN10));

答案 3 :(得分:1)

一次清理是使用返回值使其成为自己的方法。这样就可以避免所有else if

...
if (n < 100) return 10;
if (n < 1000) return 100;
if (n < 10000) return 1000; 
...

这不像普通的那样干净,就像使用@pimvdb建议的pow()函数一样干净,但这是一种更通用的方法来清理代码,其中“else-iffy”感觉就像呈现的那样

答案 4 :(得分:0)

我需要做类似的事情并提出以下建议:

x = Math.pow( 10, ( '' + n ).length - 1 );

和一些测试用例jsFiddle

n = 33;   // x = 10
n = 213;  // x = 100
n = 1776; // x = 1000

不知道性能是否优于所有log内容,并假设n是整数。