2012-03-06 107 views
2

我尝试使用下面的递归函数来实现一个相当简单的十进制到二进制转换器:神秘的2在我的JavaScript十进制输出到二进制转换器?

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。现在我已经检查了我的逻辑和数学,发现没有错误,所以我有一种感觉,这是造成这种语言的内部结构错误。所以如果有人能帮助我,并向我解释什么是最令人欣慰的问题。提前致谢。使用您可以转换小数为二进制(串):

+0

...或者你可以简单地使用:'70007..toString(2)' – zzzzBov 2012-03-06 05:37:37

回答

2

为了记录

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

应该提供正确的结果

+0

是的,但现在问题出现了,我的代码出了什么问题? – user1251380 2012-03-06 05:50:16

+0

查看我的编辑... – KooiInc 2012-03-06 07:12:28

0

我可能是错关于这一点,但是这可能是从JS数字表示为IEEE的事实引起的精度误差双打,而且你描述的数字非常大,以至于它可能实际上超出了整个值的范围,这些值可以完全用IEEE双打表示。如果是这样的话,你应该考虑让你的函数返回一个二进制表示的字符串表示,而不是1和0的数字表示。

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

希望这会有所帮助!

1

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

E.g.

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

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