我已经制作了一个转换数字基数的程序 . 我认为,如果输出中没有字符 A-F
,将数字作为数字而不是字符串返回会很方便(即使我将基数为2的数字作为常规十进制数返回,无论如何) .
出于某种原因,当我将 A3B2
32转换为Binary(应该是 1010000110101100100
2 [Wolfram|Alpha source])时,我得到 1010000110101100200
. 有's a two in there, that isn'吨二进制!返回值的最后一行代码是:
return (toBase <= 10) ? Number(result) : result;
这基本上适用于所有测试,直到我决定使用上面的base-32数字 . 我认为我的程序正在执行除法/余数步骤不正确,所以我让它在返回值之前打印出结果 . 它正确地发出了 1010000110101100100
. 所以,我直接在Chrome的控制台中测试了 Number()
方法 . 这是发生的事情:
> Number("1010000110101100100")
> 1010000110101100200
我误解了 Number()
方法的作用吗?为什么它将由所有Ones和Zeroes组成的字符串转换为带有Ones,Zeroes和 Twos 的数字?
2 回答
你在调用
Number("1010000110101100100")
时正在做的是传递一个字符串,它试图把它变成一个数字,但是这个数字高于JavaScript可以计算的数字,即9,007,199,254,740,991(也称为Number.MAX_SAFE_INTEGER
)基本上,任何超过9,007,199,254,740,991的数字都不能可靠使用,因为JavaScript使用了IEEE 754中指定的double-precision floating-point format numbers
这里's some examples, the following input numbers 19794 be the same as the output, but aren' t因为它们不可靠,如下面的 Bonus Fun With LARGE Numbers 部分所示 .
如果您仍想将十六进制转换为二进制,则需要使用
parseInt
和Number.prototype.toString
并将其保留为字符串 .大数字的奖金乐趣
以下是真的!
文档
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
来计算值 . 当你提供一个字符串 . 它有两个步骤来改变它的数量 .首先计算字符串的
Mathematical value (MV)
.在第二个过程中,它将计算出的值向上舍入 . (当你超过数字的
Math.MAX_SAFE_INTEGER
的限制时) .EcmaScript