如何计算javascript中零小数的数量?

时间:2015-06-23 11:44:36

标签: javascript performance

如何获得逗号后面的零小数位数(但不是总数)?所以说明一个例子:

0.00001 > 4
0.000015 > 4
0.0000105 > 4
0.001 > 2

我正在寻找有效的方法(意味着它们可以优化计算时间)。

8 个答案:

答案 0 :(得分:12)

您可以使用对数来查找数字的大小:

var x = 0.00195;
var m = -Math.floor( Math.log(x) / Math.log(10) + 1);
document.write(m); // outputs 2

(JavaScript的更高版本具有Math.log10。)

答案 1 :(得分:3)

这个怎么样?

function numberOfZeros(n) {
  var c = 0;
  while (!~~n) {
    c++;
    n *= 10;
  }
  return c - 1;
}

document.write(numberOfZeros(0.00065));

此代码执行以下操作:只要将数字截断为不等于0的值,它就会将数字乘以10.截断运算符“~~”非常高效,因为它直接使用数字的字节表示。

它不使用任何字符串操作,并且完全符合您的要求:计算零。

答案 2 :(得分:2)



    //my answer
    function t1()
    {
        var num = 0.0000005323;
        numOfZeroes = 0;
        while(num < 1)
        {
            numOfZeroes++;
            num *= 10;
        }
    }
    
    //others
    
    function t2()
    {
        var num = 0.0000005323;
        var m = -Math.floor( Math.log(num) / Math.log(10) + 1);
    }

    function t3()
    {
        var r = 0.0000005323;
        var count=0;
        var splited = r.toString().split(".")[1];
        for(var i=0;i<splited.length;i++)
        {
            if(splited[i]==0)
            {
                count++;
            }
            else
            {
                break;
            }    
        }
    }

    function t4()
    {

        var number = 0.0000005323;
        var numberAsString = number.toString();
        var decimalsAsString = numberAsString.substr(numberAsString.lastIndexOf('.')+1);
        var leadingZeros = decimalsAsString.substr(0, decimalsAsString.lastIndexOf('0')+1).length;
    }

    //benchmark function
    function bench(func)
    {
        var times = new Array();
        for(var t = 0; t < 100; t++)
        {
            var start = performance.now();
            for(var i = 0; i < 10000; i++)
            {
                func();
            }
            var end = performance.now();
            var time = end - start;
            times.push(time);
        }
        
        var total = 0.0;
        for(var i=0, l=times.length; i<l; i++)
            total += times[i];
        var avg = total / times.length;
        return avg;
    }

    document.write('t1: ' + bench(t1) + "ms<BR>");
    document.write('t2: ' + bench(t2) + "ms<BR>");
    document.write('t3: ' + bench(t3) + "ms<BR>");
    document.write('t4: ' + bench(t4) + "ms<BR>");
&#13;
&#13;
&#13;

注意: 这只适用于小于1的数字。否则只需删除小数左边的数字,如

num -= num % 1;

需要将此与另一种方式进行比较

修改 我想要一个更好的方法来替代这些功能。我的计算错了。我将其他人的答案添加到测试中。 我现在正在尝试使用性能API

修改 AHA!搞定了。这里有一些比较。

答案 3 :(得分:2)

使用正则表达式匹配小数点后的零数,然后计算它们。

var zeros = float.toString().match(/(\.0*)/)[0].length - 1;

DEMO

答案 4 :(得分:1)

这是一个工作示例(为清晰起见,有点冗长):

var number = 0.0004342;

var numberAsString = number.toString();

var decimalsAsString = numberAsString.substr(numberAsString.lastIndexOf('.')+1);

var leadingZeros = decimalsAsString.substr(0, decimalsAsString.lastIndexOf('0')+1).length;

// leadingZeros == 3

答案 5 :(得分:1)

将数字转换为字符串并使用点(。)将其拼出。使用for循环计数零次出现。

var r = 0.0000107;
var count=0;
var splited = r.toString().split(".")[1];
for(var i=0;i<splited.length;i++)
{
    if(splited[i]==0)
    {
        count++;
    }
    else
    {
        break;
    }

}
console.log(count);

答案 6 :(得分:0)

您可以使用以下内容:

function num (a) {
  return (a.toString().replace("0.", "").split("0").length - 1)
}

答案 7 :(得分:0)

节点9.0.0

我正在寻找没有转换或O(n)方法的解决方案,这是O(1)所做的解决方案。 部分通过日志查找十进制 - 从@AndrewMorton捕获,但它可能与divider滞后:log(10) - 2.302585092994046。

实施例

const normalize = (value, zeroCount) => {
    const total = 10 ** zeroCount
    const decimalZeros = Math.floor((-Math.log(value / total) / Math.log(10)))
    return value * (10 ** zeros)
}

用法

normalize(1510869600, 13) // 1510869600000
normalize(1510869600, 10) // 1510869600