我已经编写了一个转换数字基数的程序。我认为,在输出中没有字符A-F
的情况下,将数字返回为数字而不是字符串会很方便(即使我将以2为底的数字作为常规小数返回)数字,等等)。
由于某种原因,当我将A3B2
32 转换为Binary(应为1010000110101100100
2 [Wolfram|Alpha源)时),我得到了1010000110101100200
。里面有两个,不是二进制的!返回该值的代码的最后一行是:
return (toBase <= 10) ? Number(result) : result;
这对于基本上所有的测试都可以正常工作,直到我决定使用上面的base-32数字。我以为我的程序做的除法/余数步骤不正确,所以我让它在返回值之前打印出结果。它正确发出了1010000110101100100
。因此,我直接在Chrome的控制台中测试了Number()
方法。这就是发生的事情:
> Number("1010000110101100100")
> 1010000110101100200
我误解了Number()
方法的作用吗?为什么将由全1和全0组成的字符串转换为具有全1,全零和 2 的数字?
答案 0 :(得分:6)
调用Number("1010000110101100100")
时,您正在做的事情是传递一个字符串,该字符串试图将其转换为数字,但是该数字高于JavaScript可以计数的数字,即9,007,199,254,740,991(也称为{{ 1}})
基本上,不能可靠地使用超过9,007,199,254,740,991的任何数字,因为JavaScript使用double-precision floating-point format numbers中指定的IEEE 754
下面是一些示例,以下输入数字“应”与输出相同,但并非如此,因为它们已经超过了MAX_SAFE_INTEGER。有些是,但是不可靠,如下面的具有大数字的奖励乐趣部分所示。
Number.MAX_SAFE_INTEGER
如果您仍想将十六进制转换为二进制,则需要使用Number("9007199254740992") // 9007199254740992
Number("9007199254740993") // 9007199254740992
Number("9007199254740994") // 9007199254740994
Number("9007199254740995") // 9007199254740996
Number("9007199254740996") // 9007199254740996
Number("9007199254740997") // 9007199254740996
Number("9007199254740998") // 9007199254740998
Number("9007199254740999") // 9007199254741000
和parseInt
并将其保留为字符串。
Number.prototype.toString
以下是正确的!
const hex = "A3B2";
const binary = parseInt(hex, 16).toString(2);
console.log(binary);
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString
答案 1 :(得分:0)
@AnonymusSB说的没错。我要添加一些细节。
因此,当您Number(value)
内部调用ToNumber
来计算值时。当您提供字符串时。它有两个步骤来更改它的编号。
Mathematical value (MV)
。Math.MAX_SAFE_INTEGER
的限制时,它会将数字四舍五入。
console.log(Number("9007199254740996"))
console.log(Number("9007199254740997"), "rounded down")
console.log(Number("9007199254740998"))
console.log(Number("9007199254740999") ,"rounded up")