JavaScript的内置Number()方法似乎返回了错误的值

时间:2018-12-10 04:20:21

标签: javascript numbers built-in

我已经编写了一个转换数字基数的程序。我认为,在输出中没有字符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 的数字?

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

答案 1 :(得分:0)

@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