确定浮点数中前导零的数量

hip*_*ail 4 javascript language-agnostic algorithm math floating-point

如何计算浮点数中小数点之后但第一个非零之前有多少个零。例子:

0 -> 0
1 -> 0
1.0 -> 0
1.1 -> 0
1.01 -> 1
1.00003456 ->4
Run Code Online (Sandbox Code Playgroud)

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

我知道可以通过首先将数字转换为字符串来完成,只要该数字不是科学记数法,但我想要一个纯数学解决方案。

就我而言,如果这很复杂,我不需要适用于负数的东西。

我想知道无论语言如何,一般的方法是什么。

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

作为旁注,我想知道这个计算是否与确定整数的十进制表示需要多少位的方法有关。

Ant*_*ton 5

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

\n\n
\n

x = [a 1 a 2 ...a n ] [0 1 0 2 ...0][b 1 b 2 ...b]

\n
\n\n

这意味着 的小数部分x大于或等于 10 \xe2\x80\x93m,并且小于 10 \xe2\x80\x93m+1

\n\n

也就是说 的小数部分的十进制对数x大于等于\xe2\x80\x93m且小于\xe2\x80\x93m+1

\n\n

反过来,这意味着小数部分的小数对数的整数部分x等于\xe2\x80\x93m

\n\n

\r\n
\r\n
function numZeroesAfterPoint(x) {\r\n  if (x % 1 == 0) {\r\n    return 0;\r\n  } else {\r\n    return -1 - Math.floor(Math.log10(x % 1));\r\n  }\r\n}\r\n\r\nconsole.log(numZeroesAfterPoint(0));\r\nconsole.log(numZeroesAfterPoint(1));\r\nconsole.log(numZeroesAfterPoint(1.0));\r\nconsole.log(numZeroesAfterPoint(1.1));\r\nconsole.log(numZeroesAfterPoint(1.01));\r\nconsole.log(numZeroesAfterPoint(1.00003456));
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

\n

作为旁注,我想知道这个计算是否与确定整数的十进制表示需要多少位的方法有关。

\n
\n\n

同样,正整数x采用n小数位来表示当且仅当n - 1 <= log10(x) < n

\n\n

所以 的十进制表示形式的位数xfloor(log10(x)) + 1

\n\n

也就是说,我不建议在实践中使用这种确定位数的方法。log10不保证给出精确的对数值(甚至不如 IEEE 754 允许的那么精确),这可能会导致在某些边缘情况下产生不正确的结果。

\n

  • 由于上述浮点问题,“1.001”返回 3 (2认同)