首页 文章

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

提问于
浏览
4

我已经制作了一个转换数字基数的程序 . 我认为,如果输出中没有字符 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 回答

  • 6

    你在调用 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 部分所示 .

    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

  • 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")
    

    EcmaScript

相关问题