2017-09-10 76 views
3

前导零的数量如何计算许多零怎么来小数点后但在浮点数的第一个非零之前。示例:确定一个浮点数

0 -> 0 
1 -> 0 
1.0 -> 0 
1.1 -> 0 
1.01 -> 1 
1.00003456 ->4 

直觉上我假设有一个数学函数提供了这个,或者至少是主要部分。但我既不记得也不知道哪一个。

我知道它可以通过首先把转换成字符串,只要数量不是用科学计数法来完成,但我想一个纯数学的解决方案。

在我来说,我并不需要的东西,负数工作,如果这是一个并发症。

我想知道什么是一般的方式去做的,不论语言。

但如果有这个一个相当标准的数学函数,我也想知道如果JavaScript有这个功能。

作为旁注,不知该计算相关的方法,用于确定多少位数所需要的一个整数的十进制表示。

+1

我已经更新我的答案,刚刚意识到犯了一个小错误。 – turmuka

回答

4

x是一个非整数部分可以写成n的整数部分,然后小数点,然后是零,其余部分小数部分。

X = [A 1 一个 ...一个Ñ] [0 ...0] [B b 。B]

这意味着x小数部分是大于或等于10 -m,和更小比10 -m + 1

换句话说,x的小数部分的小数对数大于或等于–m,并且小于–m+1

这又意味着x的小数部分的小数部分的整个部分等于–m

function numZeroesAfterPoint(x) { 
 
    if (x % 1 == 0) { 
 
    return 0; 
 
    } else { 
 
    return -1 - Math.floor(Math.log10(x % 1)); 
 
    } 
 
} 
 

 
console.log(numZeroesAfterPoint(0)); 
 
console.log(numZeroesAfterPoint(1)); 
 
console.log(numZeroesAfterPoint(1.0)); 
 
console.log(numZeroesAfterPoint(1.1)); 
 
console.log(numZeroesAfterPoint(1.01)); 
 
console.log(numZeroesAfterPoint(1.00003456));

作为旁注,不知该计算相关的方法,用于确定多少位数所需要的一个整数的十进制表示。

以相同的方式,一个正整数x需要n十进制数字当且仅当n - 1 <= log10(x) < n来代表它。

因此,x的十进制表示中的位数是floor(log10(x)) + 1

也就是说,我不会推荐使用这种方法来确定实际中的位数。 log10不能保证给出对数的确切值(甚至不像IEEE 754允许的那样精确),这可能导致在某些边缘情况下的不正确结果。

+0

在我的情况下,我只处理货币和汇率。我使用了4位小数,但是当我将IRR与KWD进行比较时发生了这种情况,所以我开始将它作为一个纯粹的数学问题感兴趣。( - : – hippietrail

+1

要增加这个优秀的答案:基于浮点数的十进制表示的计算总是由于与底层二进制格式相比内在的不精确性会导致问题。在尝试这样做之前,我建议试着理解浮点数是如何工作的:一个好的起点是www.exploringbinary.com。 –

+0

我是接受这个答案,因为我能够独立提出一个while循环解决方案,但我真的对数学解决方案感兴趣。 – hippietrail

0

你可以用toFixed()方法来做,但是在我的代码中只有一个缺陷,你需要指定在这个点之后的数字的长度.这是由于使用方法的原因。

注:

toFixed()方法的最大长度为20,所以.如说 in the docs

var num = 12.0003400; 

var lengthAfterThePoint = 7; 
var l = num.toFixed(lengthAfterThePoint); 
var pointFound = false; 
var totalZeros = 0; 

for(var i = 0; i < l.length; i++){ 
    if(pointFound == false){ 
    if(l[i] == '.'){ 
     pointFound = true; 
    } 
    }else{ 
    if(l[i] != 0){ 
     break; 
    }else{ 
     totalZeros++; 
    } 
    } 
} 
console.log(totalZeros); 

额外回答

后不进入超过20个号码这是我额外的答案,在这个函数中,程序计数所有的零直到最后的非零。所以它最后忽略了所有的零。

var num = 12.034000005608000; 

var lengthAfterThePoint = 15; 
var l = num.toFixed(lengthAfterThePoint); 
var pointFound = false; 
var theArr = []; 

for(var i = 0; i < l.length; i++){ 
    if(pointFound == false){ 
    if(l[i] == '.'){ 
     pointFound = true; 
    } 
    }else{ 
    theArr.push(l[i]); 
    } 
} 


var firstNumFound = false; 
var totalZeros = 0; 

for(var j = 0; j < theArr.length; j++){ 
    if(firstNumFound == false){ 
    if(theArr[j] != 0){ 
     firstNumFound = true; 
     totalZeros = totalZeros + j; 
    } 
    }else{ 
    if(theArr[j] == 0){ 
     totalZeros++; 
    } 
    } 
} 


var totalZerosLeft = 0; 
for (var k = theArr.length; k > 0; k--) { 
    if(theArr[k -1] == 0){ 
    totalZerosLeft++; 
    }else{ 
    break; 
    } 
} 

console.log(totalZeros - totalZerosLeft); 
2

你可以用一个简单的循环while做到这一点:

function CountZeros(Num) { 

    var Dec = Num % 1; 
    var Counter = -1; 

    while ((Dec < 1) && (Dec > 0)) { 
     Dec = Dec * 10; 
     Counter++; 
    } 
    Counter = Math.max(0, Counter); // In case there were no numbers at all after the decimal point. 

    console.log("There is: " + Counter + " zeros"); 
} 

然后就传你要检查到该函数的数量:

CountZeros(1.0034); 
+0

这不工作稳定,当'1.0000340001120'输入时返回4 – turmuka

+0

刚更新我的答案,更好的方式。 –

+0

仍然会返回4 – turmuka

1

我的做法是使用while()循环,同时增加x直到两个不相等的.floor(n)价值与它的n.toFixed(x)值进行比较:

console.log(getZeros(0));   //0 
 
console.log(getZeros(1));   //0 
 
console.log(getZeros(1.0));   //0 
 
console.log(getZeros(1.1));   //0 
 
console.log(getZeros(1.01));  //1 
 
console.log(getZeros(1.00003456)); //4 
 

 
function getZeros(num) { 
 
    var x = 0; 
 
    if(num % 1 === 0) return x; 
 
    while(Math.floor(num)==num.toFixed(x)) {x++;} 
 
    return(x-1); 
 
}