为什么(73).toString(36)
返回21
和(0.73).toString(36)
返回0.qa2voha2volfpsnhmyhqia4i
而不是 0.21?
问问题
4666 次
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, f
第f
16位一样,在 36 基系统中我们有0, 1, ..., 9, ..., q, ..., z
第q
26位和a
第 10 位digit
。
此问题的原因在于0.21
36-base36
比21
36-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 回答