神秘的2出现在我的JavaScript十进制到二进制转换器的输出中

Mysterious 2 arising in the output of my JavaScript decimal to binary converter?

本文关键字:二进制 转换器 输出 十进制 我的 2出 JavaScript      更新时间:2023-09-26

我正在尝试使用以下递归函数实现一个相当简单的十进制到二进制转换器:

function dectobin(d) {
            if (0 >= d) { return 0; }
            else if (1 == d) { return 1; }
            else {
                return 10 * dectobin(Math.floor(d / 2)) + (d % 2);
            }
        }

现在的问题是,当我用70007测试它时,当最后一个条目从堆栈中弹出时,在最后一次递归时,似乎有1的溢出。因此,一旦dectobin(35003)返回100010001011101,它将按10缩放到1000100010111010,并假设添加1。只是,它没有加1,而是加了2,所以答案变成:1000100010111012。现在我检查了我的逻辑和数学,没有发现错误,所以我有一种感觉,这是导致这个错误的语言的内部结构。因此,如果有人能在这里帮助我,并向我解释问题所在,那将是最令人满意的。提前谢谢。

对于记录:您可以使用:将十进制转换为二进制(字符串)

(70007).toString(2)

没有必要乘以10。此外,0 >= d永远不会满足。

将函数重写为:

function dectobin(d) {
  function recurse(dd) {
    return dd > 1 ? recurse(Math.floor(dd/2))+''+dd%2 : dd;
  }
  return recurse(d);
}

应提供正确的结果

长度超过15位的数字在JavaScript中是不可靠的,因为IEEE加倍时数字的内部表示。

例如

10001000101110110+1 == 10001000101110112
10001000101110110+2 == 10001000101110112
10001000101110110+3 == 10001000101110112
10001000101110110+4 == 10001000101110114
10001000101110110+5 == 10001000101110116

它们都是真的;因此,您可能想要查看一些BigNumber库以使您的代码正常工作。

我可能错了,但这可能是一个精度错误,因为JS数字被表示为IEEE双精度,而您所描述的数字太大,实际上可能超出了IEEE双精度所能精确表示的整数值范围。如果是这种情况,您可能应该考虑让函数返回二进制表示的字符串表示,而不是1和0的数字表示。

根据前面的答案,IEEE二重(可表示的整数中没有间隙)可以精确表示的最大整数是2^53,大约是10^14。你描述错误的数字超过了14位,所以我怀疑这就是问题所在。

希望这能有所帮助!