Javascript Number.toString(基数)行为
Javascript Number.toString(radix) behavior
为什么 (73).toString(36)
returns 21
和 (0.73).toString(36)
returns 0.qa2voha2volfpsnhmyhqia4i
而不是 0.21?
那是因为浮点数是以二进制分数形式存储的(一个数除以2的幂),73/100不能用二进制表示为一个不重复的分数。因此在内部,它存储一个值 close 到 0.73 但不完全相等。这就是为什么您在 toString() 方法中得到这么多数字的原因。
73/100也不能表示为36进制的不重复小数。一般来说,小数a/b只能得到小数点后固定位数给定基数 x,如果你可以将 a/b 简化为 c/(x^n) 的形式,对于某些整数 c 和 n.
73 = 2 x 36 + 1
0.73 = 26/36 + 10/(36 * 36) + ...
就像在十六进制中,我们有 0, ..., 9, a, b, c, d, e, f
,其中 f
是第 16 个 数字 ,在 36 位系统中,我们有 0, 1, ..., 9, ..., q, ..., z
和 q
是第 26 个 位 和 a
第 10 个 digit
.
这个问题的原因在于 36-base 中的 0.21
比 36-base 中的 21
小 36
倍,而不是 10
倍。
36 碱基的数字将有 36 个数字:从 0 到 z。
73 以 10 为基数 = 21 以 36 为基数,因为 1 + 2 * 36 = 73
.
浮点数根本不是这样计算的。 (0.5).toString(2)
不是 0.101
,而是 0.1
。 0.73 计算转换为任何基数将 return 一个从 0 到 1 正好是 73% 的数字。
数字 => 字母表
let childs = [];
for (let i = 10; i < 36; i++) {
childs.push(
i.toString(36)
);
}
// 26
childs;
// (26) ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
为什么 (73).toString(36)
returns 21
和 (0.73).toString(36)
returns 0.qa2voha2volfpsnhmyhqia4i
而不是 0.21?
那是因为浮点数是以二进制分数形式存储的(一个数除以2的幂),73/100不能用二进制表示为一个不重复的分数。因此在内部,它存储一个值 close 到 0.73 但不完全相等。这就是为什么您在 toString() 方法中得到这么多数字的原因。
73/100也不能表示为36进制的不重复小数。一般来说,小数a/b只能得到小数点后固定位数给定基数 x,如果你可以将 a/b 简化为 c/(x^n) 的形式,对于某些整数 c 和 n.
73 = 2 x 36 + 1
0.73 = 26/36 + 10/(36 * 36) + ...
就像在十六进制中,我们有 0, ..., 9, a, b, c, d, e, f
,其中 f
是第 16 个 数字 ,在 36 位系统中,我们有 0, 1, ..., 9, ..., q, ..., z
和 q
是第 26 个 位 和 a
第 10 个 digit
.
这个问题的原因在于 36-base 中的 0.21
比 36-base 中的 21
小 36
倍,而不是 10
倍。
36 碱基的数字将有 36 个数字:从 0 到 z。
73 以 10 为基数 = 21 以 36 为基数,因为 1 + 2 * 36 = 73
.
浮点数根本不是这样计算的。 (0.5).toString(2)
不是 0.101
,而是 0.1
。 0.73 计算转换为任何基数将 return 一个从 0 到 1 正好是 73% 的数字。
数字 => 字母表
let childs = [];
for (let i = 10; i < 36; i++) {
childs.push(
i.toString(36)
);
}
// 26
childs;
// (26) ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]