【问题标题】:Mysterious 2 arising in the output of my JavaScript decimal to binary converter?我的 JavaScript 十进制到二进制转换器的输出中出现的神秘 2?
【发布时间】:2012-03-23 14:51:08
【问题描述】:

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

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)

标签: javascript algorithm recursion binary decimal


【解决方案1】:

作为记录:您可以使用以下方法将十进制转换为二进制(字符串):

(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);
}

应该提供正确的结果

【讨论】:

  • 是的,但是既然提出了问题,我的代码有什么问题?
【解决方案2】:

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

例如

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

他们都是真的;所以您可能想查看一些 BigNumber 库以使您的代码正常工作。

【讨论】:

    【解决方案3】:

    我对此可能是错误的,但这可能是由于 JS 数字表示为 IEEE 双精度数而导致的精度错误,并且您描述的数字太大以至于它实际上可能超出了范围整数值可以用 IEEE 双精度精确表示。如果是这种情况,您可能应该考虑让您的函数返回二进制表示的字符串表示,而不是 1 和 0 的数字表示。

    根据this earlier answer,IEEE double 可精确表示的最大整数(可表示整数中没有间隙)是 2^53,大约是 10^14。您描述错误的数字超过 14 位,所以我怀疑这是问题所在。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 2022-01-09
      • 2021-08-29
      • 2018-01-20
      • 2014-02-20
      相关资源
      最近更新 更多