神秘的2出现在我的JavaScript十进制到二进制转换器的输出中
Mysterious 2 arising in the output of my JavaScript decimal to binary converter?
我正在尝试使用以下递归函数实现一个相当简单的十进制到二进制转换器:
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位,所以我怀疑这就是问题所在。
希望这能有所帮助!
相关文章:
- 带时区的Javascript Datestring转换器
- 带Js的货币转换器
- Ajax调用OGRE转换器
- JavaScript中的温度转换器(IF ELSE条件)
- PDF到JPG的转换器
- 数据互绑定问题:转换器只运行一次,无法绑定元素的 ID
- 货币转换器未转换
- 显示Aurelia值转换器上的所有过滤器
- AngularJS希伯来文日期转换器
- 带有JSONp的货币转换器
- JS或C#中的货币转换器
- 设置money.js(用于货币转换器)时出现问题
- 创建/使用简单的美制到公制转换器的问题.(HTML/JavaScript)函数未启动
- Backbone.js的Backbone.Modelbinding插件中是否有绑定的转换器参数
- Clojure到JavaScript转换器(Leiningen)
- 如何为温度转换器编写简单的javascript代码.
- JavaScript日期转换器
- ASCII到键码转换器
- 神秘的2出现在我的JavaScript十进制到二进制转换器的输出中
- c# - UTF8⇔二进制,十六进制和64进制转换器