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

JavaScript's Built-in Number() method seems to return an incorrect value

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

出于某种原因,当我将 A3B232 转换为二进制时(应该是 10100001101011001002 [Wolfram|Alpha 来源]),我得到了 1010000110101100200。那里有一个二,那不是二元的! return 值的最后一行代码是:

return (toBase <= 10) ? Number(result) : result;

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

> Number("1010000110101100100")
> 1010000110101100200

我是否误解了 Number() 方法的作用?为什么它将由全 1 和 0 组成的字符串转换为具有 1、0 和 Twos 的数字?

你在调用 Number("1010000110101100100") 时正在做的是传递一个字符串,它试图将其转换为一个数字,但该数字大于 JavaScript 可以计数的数字,即 9,007,199,254,740,991 (也称为 Number.MAX_SAFE_INTEGER

基本上,任何超过 9,007,199,254,740,991 的数字都不能可靠地使用,因为 JavaScript 使用 double-precision floating-point format numbers as specified in IEEE 754

这里有一些例子,下面的输入数字 "should" 与输出相同,但不是因为它们已经超过了 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

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

const hex = "A3B2";
const binary = parseInt(hex, 16).toString(2);
console.log(binary);

大数字的额外乐趣

以下为真!

console.log(9007199254740992 === 9007199254740993);
console.log(1010000110101100200 === 1010000110101100100)

文档

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

@AnonymusSB 说的对。我想添加一些细节。

因此,当您 Number(value) 时,它会在内部调用 ToNumber 来计算该值。当你提供一个字符串时。它有两个步骤来更改它的编号。

  1. 首先计算字符串的Mathematical value (MV)
  2. 在第二个过程中,它会将计算值四舍五入。(当您超过 Math.MAX_SAFE_INTEGER 的限制时,它会四舍五入)。

console.log(Number("9007199254740996"))
console.log(Number("9007199254740997"), "rounded down")
console.log(Number("9007199254740998"))
console.log(Number("9007199254740999") ,"rounded up")

EcmaScript