如何计算 float 中小数点之后但第一个非零之前有多少个零。示例:
0 -> 0
1 -> 0
1.0 -> 0
1.1 -> 0
1.01 -> 1
1.00003456 ->4
凭直觉,我假设有一个数学函数可以提供此功能,或者至少可以提供主要部分。但我既不记得也不知道是哪一个。
我知道这可以通过首先将数字转换为字符串来完成,只要数字不是科学计数法,但我想要一个纯数学解决方案。
在我的例子中,如果这很复杂,我不需要对负数有效的东西。
我想知道一般的方法是什么,不管语言如何。
但是如果有一个非常标准的数学函数,我也想知道 JavaScript 是否有这个函数。
作为旁注,我想知道这个计算是否与确定整数的十进制表示需要多少位的方法有关。
最佳答案
设 x
是一个非整数,可以写成整数部分的 n
数字,然后是小数点,然后是 m
零,然后是小数部分的其余部分。
x = [a1a2...an] . [0102...0m][b1b2...bm]
这意味着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));
As a sidenote, I wonder if this calculation is related to the method for determining how many digits are required for the decimal representation of an integer.
以同样的方式,当且仅当 x
时,正整数 n
用 n - 1 <= log10(x) < n
十进制数字来表示它。
所以x
的十进制表示的位数是floor(log10(x)) + 1
。
也就是说,我不建议在实践中使用这种确定位数的方法。 log10
不保证给出准确的对数值(甚至不如 IEEE 754 允许的那样准确),这可能会在某些边缘情况下导致不正确的结果。
关于javascript - 确定 float 中前导零的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46136440/