如何获得逗号后面的零小数位数(但不是总数)?所以说明一个例子:
0.00001 > 4
0.000015 > 4
0.0000105 > 4
0.001 > 2
我正在寻找有效的方法(意味着它们可以优化计算时间)。
答案 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;
注意:强> 这只适用于小于1的数字。否则只需删除小数左边的数字,如
num -= num % 1;
需要将此与另一种方式进行比较
修改强> 我想要一个更好的方法来替代这些功能。我的计算错了。我将其他人的答案添加到测试中。 我现在正在尝试使用性能API
修改强> AHA!搞定了。这里有一些比较。
答案 3 :(得分:2)
答案 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)
我正在寻找没有转换或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