JavaScript的内置Number()方法似乎返回了一个不正确的值

mat*_*own 4 javascript numbers built-in

我已经制作了一个转换数字基数的程序.我认为,如果A-F输出中没有字符,将数字作为数字而不是字符串返回会很方便(即使我将基数为2的数字作为常规十进制数字返回,无论如何).

出于某种原因,当我将A3B232转换为Binary(应该是10100001101011001002 [ Wolfram | Alpha source])时,我得到了1010000110101100200.那里有两个,那不是二元的!返回值的最后一行代码是:

return (toBase <= 10) ? Number(result) : result;
Run Code Online (Sandbox Code Playgroud)

这基本上适用于所有测试,直到我决定使用上面的base-32数字.我认为我的程序正在执行除法/余数步骤不正确,所以我让它在返回值之前打印出结果.它正确地给出了1010000110101100100.所以,我Number()直接在Chrome的控制台中测试了这个方法.这就是发生的事情:

> Number("1010000110101100100")
> 1010000110101100200
Run Code Online (Sandbox Code Playgroud)

我误解了这种Number()方法的作用吗?为什么将由所有Ones和Zeroes组成的字符串转换为包含Ones,Zeroes和Twos的数字

Ano*_*sSB 6

你在调用时正在做的Number("1010000110101100100")是传递一个字符串,它试图把它变成一个数字,但是这个数字高于JavaScript可以计算的数字,即9,007,199,254,740,991(也称为Number.MAX_SAFE_INTEGER)

基本上,任何超过9,007,199,254,740,991的数字都不能可靠使用,因为JavaScript使用IEEE 754中规定的双精度浮点格式数字

以下是一些示例,以下输入数字"应该"与输出相同,但不是因为它们已超过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
Run Code Online (Sandbox Code Playgroud)

如果您仍想将十六进制转换为二进制,则需要使用parseInt并将Number.prototype.toString其保留为字符串.

const hex = "A3B2";
const binary = parseInt(hex, 16).toString(2);
console.log(binary);
Run Code Online (Sandbox Code Playgroud)

与大数字的奖金乐趣

以下是真的!

console.log(9007199254740992 === 9007199254740993);
console.log(1010000110101100200 === 1010000110101100100)
Run Code Online (Sandbox Code Playgroud)

文档

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/Number/MAX_SAFE_INTEGER

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