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

如何计算javascript中的零位小数数?,javascript,performance,Javascript,Performance,如何获得逗号后面的零位小数数(但不是总数)?举个例子: 0.00001 > 4 0.000015 > 4 0.0000105 > 4 0.001 > 2 我正在寻找高效的方法(这意味着它们优化了计算时间)。这个方法怎么样 函数numberofzero(n){ var c=0; 而(!~~n){ C++; n*=10; } 返回c-1; } 文件。写入(numberOfZeros(0.00065))您可以使用如下内容: function num (a) { retu

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

0.00001 > 4
0.000015 > 4
0.0000105 > 4
0.001 > 2
我正在寻找高效的方法(这意味着它们优化了计算时间)。

这个方法怎么样

函数numberofzero(n){
var c=0;
而(!~~n){
C++;
n*=10;
}
返回c-1;
}

文件。写入(numberOfZeros(0.00065))您可以使用如下内容:

function num (a) {
  return (a.toString().replace("0.", "").split("0").length - 1)
}
//我的答案
函数t1()
{
var num=0.0000005323;
numfozeres=0;
while(num<1)
{
numOfZeroes++;
num*=10;
}
}
//其他
函数t2()
{
var num=0.0000005323;
var m=-Math.floor(Math.log10(num)+1);
}
函数t3()
{
var r=0.0000005323;
var计数=0;
var splited=r.toString().split(“.”[1];
对于(var i=0;i,这里有一个工作示例(为清晰起见有点冗长):


将数字转换为字符串并用点(.)表示。使用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);
var r=0.0000107;
var计数=0;
var splited=r.toString().split(“.”[1];

对于(var i=0;i使用正则表达式匹配小数点后的零数,然后对它们进行计数

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

您可以使用对数来计算数字的大小:

var x = 0.00195;
var m = -Math.floor( Math.log(x) / Math.log(10) + 1);
document.write(m); // outputs 2
JavaScript的更高版本有Math.log10,因此它应该是:

var x = 0.00195;
var m = -Math.floor( Math.log10(x) + 1);
document.write(m); // outputs 2
如何使用以10为底的数字对数:

x 数学log10(x) 数学地板(数学log10(x)+1) 0.1 -1 0 0.01 -2 -1 0.015 -1.8239… -1 0.001 -3 -2 0.00001 -5 -4 0.000015 -4.8239… -4 0.0000105 -4.9788… -4 #节点9.0.0 我一直在寻找没有转换或O(n)方法的解决方案,下面是我用O(1)所做的解决方案。 通过log查找小数的一部分–从@AndrewMorton获取,但它可能与除法器有关:log(10)–2.302585092994046

例子
const normalize=(值,零计数)=>{
常数总计=10**零计数
常数零=数学地板(-Math.log10(值/总数))
返回值*(10**零)
}
用法

这些值是字符串格式还是浮点格式?它是浮点。到目前为止,我只是用for循环尝试了一下,但对我来说似乎没有效率。@JohnAndrews它似乎没有效率?你测量过吗?它对它的任务来说太慢了吗?啊…很抱歉。如果一个数字是0.000105呢?那么我得到4个零,但它应该只有3个。是的,你的要求元素是不同的。不仅仅是零的数量。它前面应该没有零。对吗?正如我在其他地方指出的,我不认为执行字符串操作是有效的。另一个例子是将十进制字符串转换为int,然后再转换回字符串,并比较长度上的差异(因为int转换会删除所有前导的0)。是的,所以如果重复执行此操作(对于大数系列),我可能会选择其他操作。但由于此用例有点不常见,我会努力获得可理解的代码。:)如果一个数字是0.000105怎么办?然后我得到4个零,但它应该只有3个。不,你没有。请参阅演示。如果使用时出错:
var float4=parseFloat('1');
通过检查有效性来修复:
console.log(float4?float4[0]。长度-1:0)
作为提示,这将返回
-0
0.195
。如果这真的很重要的话。@AndrewMorton Chrome 43不错的一个,Andrew!我会对该代码进行注释以澄清它的作用-起初我并不清楚。:)@TedNyberg它不打算成为生产就绪代码:它缺少对
x>0.0&&x<1.0
的检查。如果您感兴趣,我在下面的答案上做了一个很好的测试。您的答案似乎是目前为止最快的。小心,如果您使用n=0调用它,它将得到一个无限循环。有点晚了,但是node.js在V4之前就已经存在了,所以您可以使用
const decimalZeros=Math.floor(-Math.log10(value/total))
@AndrewMorton nice,我已经更新了答案
var x = 0.00195;
var m = -Math.floor( Math.log10(x) + 1);
document.write(m); // outputs 2
normalize(1510869600, 13) // 1510869600000
normalize(1510869600, 10) // 1510869600