0

为什么(73).toString(36)返回21(0.73).toString(36)返回0.qa2voha2volfpsnhmyhqia4i而不是 0.21?

4

4 回答 4

5

这是因为浮点数存储为二进制分数(一个数字除以 2 的幂),而 73/100 不能表示为二进制的非重复分数。因此在内部,它存储的值接近0.73 但不完全相等。这就是为什么你在 toString() 方法中得到这么多数字的原因。

73/100 也不能表示为以 36 为基数的非重复分数。通常,对于分数 a/b,如果可以减少,您只能在给定的基数 x 中获得小数点后的固定位数对于某些整数 c 和 n,将 a/b 转换为 c/(x^n) 的形式。

于 2015-02-11T22:39:13.650 回答
2
73 = 2 x 36 + 1
0.73 = 26/36 + 10/(36 * 36) + ...

就像在十六进制中我们有0, ..., 9, a, b, c, d, e, ff16一样,在 36 基系统中我们有0, 1, ..., 9, ..., q, ..., zq26a第 10 位digit

此问题的原因在于0.2136-base362136-base 小倍,而不是10倍。

于 2015-02-11T22:39:31.840 回答
1

36 基数将有 36 位数字:从 0 到 z。

以 10 为底的 73 = 以 36 为底的 21,因为1 + 2 * 36 = 73.

浮点数根本不是这样计算的。(0.5).toString(2)不是0.101,但是0.1。0.73 计算转换为任何基数将返回一个从 0 到 1 正好是 73% 的数字。

于 2015-02-11T22:42:01.873 回答
0

数字 => 字母

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"]

于 2017-07-17T07:40:07.217 回答