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, ..., zq 是第 26 个 a 第 10 个 digit.

这个问题的原因在于 36-base 中的 0.21 比 36-base 中的 2136 倍,而不是 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"]