We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Number.MAX_SAFE_INTEGER // 9007199254740991 Number.MAX_SAFE_INTEGER + 2 // 9007199254740992 9007199254740993 // 控制台输出:9007199254740992 2 ** 53 - 1 // 9007199254740991 Number.MIN_SAFE_INTEGER // -9007199254740991
是的,没有看错,我以前也从没意识到这个问题,毕竟这种数我在业务中没有接触过。今天开始研究 BigInt 看它介绍才意识到这个问题。
BigInt
说到底还是 IEEE 754-2019 64位双精度浮点数的问题(这个又和二进制有关,二进制又是计算机基础,所以像我一样非科班的转行者必须要花时间自己补习下基础知识)。
由于ECMAScript采用的是 64位 双精度浮点数。抛开 IEEE 754-2019 不谈,普通64位数其实就是64个二进制组成的数。有点二进制基础的应该都知道,64位数能表示的无符号数范围是 -264 ~ 264 - 1,但这里是 IEEE 754-2019 64位双精度浮点数,其中只有53位有效位,所以其表示的无符号数范围应该在 -253 ~ 253 - 1。
253 - 1 正好就是 Number.MAX_SAFE_INTEGER。不过这里 Number.MIN_SAFE_INTEGER 却是 -253 + 1。
Number.MAX_SAFE_INTEGER
Number.MIN_SAFE_INTEGER
由上面可知 Number 能表示的数的安全范围,所以超出这个范围的数,Number 表示会有问题,为了解决这种问题,就引进了新的数据类型 BigInt。但是,它只能表示整数!!!
Number
// 没有问题 9007199254740993n // 9007199254740993n 2n ** 53n + 2n // 9007199254740994n BigInt(Number.MAX_SAFE_INTEGER) + 2n // 9007199254740993n 9007199254740993.5n // Uncaught SyntaxError: Invalid or unexpected token
BigInt类型表示 数学整数 值。其值可以是任何大小,并且不限于特定的位宽(没有大小限制)。除非另有说明,它的运算和设计是用来返回精确的数学答案。对于位运算而言,BigInts充当两个二进制字符串的补码,负数被视为将位无限地设置在左边。
BigInt::unit 值为 1n。
-0n // 0n -1n // -1n -(-1n) // 1n
~0n // -1n ~1n // -2n ~(-1n) // 0n
该抽象运算伴有BigInt类型的参数 x 返回 x 的补码;即 -x - 1
1n ** -1n // Uncaught RangeError: Exponent must be positive 0n ** 0n // 1n 2n ** 2n // 4n
1n * 2n // 2n
0n / 0n // Uncaught RangeError: Division by zero 1n / 2n // 0n 1n / 3n // 0n
3n % 2n // 1n
0n + 1n // 1n
0n - 1n // -1n
1n << -1n // 0n -1n << -1n // -1n 1n << 1n // 2n
1n >> 1n // 0n
1n >>> 1n // Uncaught TypeError: BigInts have no unsigned right shift, use >> instead
1n < 2n // true 1n < 1n // false
1n === 1n // true
如果 x 和 y 有相同的 数学整数 值,则返回 true,否则返回 false
二进制运算
'-'
The text was updated successfully, but these errors were encountered:
No branches or pull requests
js数据类型:BigInt
为何需要这个数据类型?
是的,没有看错,我以前也从没意识到这个问题,毕竟这种数我在业务中没有接触过。今天开始研究
BigInt
看它介绍才意识到这个问题。说到底还是 IEEE 754-2019 64位双精度浮点数的问题(这个又和二进制有关,二进制又是计算机基础,所以像我一样非科班的转行者必须要花时间自己补习下基础知识)。
由于ECMAScript采用的是 64位 双精度浮点数。抛开 IEEE 754-2019 不谈,普通64位数其实就是64个二进制组成的数。有点二进制基础的应该都知道,64位数能表示的无符号数范围是 -264 ~ 264 - 1,但这里是 IEEE 754-2019 64位双精度浮点数,其中只有53位有效位,所以其表示的无符号数范围应该在 -253 ~ 253 - 1。
253 - 1 正好就是
Number.MAX_SAFE_INTEGER
。不过这里Number.MIN_SAFE_INTEGER
却是 -253 + 1。由上面可知
Number
能表示的数的安全范围,所以超出这个范围的数,Number
表示会有问题,为了解决这种问题,就引进了新的数据类型 BigInt。但是,它只能表示整数!!!BigInt 类型
BigInt类型表示 数学整数 值。其值可以是任何大小,并且不限于特定的位宽(没有大小限制)。除非另有说明,它的运算和设计是用来返回精确的数学答案。对于位运算而言,BigInts充当两个二进制字符串的补码,负数被视为将位无限地设置在左边。
BigInt::unit 值为 1n。
BigInt::unaryMinus( x ) 一元减
BigInt::bitwiseNOT( x ) 按位非
该抽象运算伴有BigInt类型的参数 x 返回 x 的补码;即 -x - 1
BigInt::exponentiate( base, exponent ) 求幂
BigInt::multiply( x, y ) 乘法
BigInt::divide( x, y ) 除
BigInt::remainder( n, d ) 取余
BigInt::add( x, y ) +
BigInt::subtract( x, y ) -
BigInt::leftShift( x, y ) 左移
BigInt::signedRightShift( x, y ) 有符号右移
BigInt::unsignedRightShift( x, y ) 无符号右移
BigInt::lessThan( x, y )
BigInt::equal( x, y )
如果 x 和 y 有相同的 数学整数 值,则返回 true,否则返回 false
BigInt::sameValue( x, y )
BigInt::sameValueZero( x, y )
BinaryAnd( x, y ) 二进制与
BinaryOr( x, y ) 二进制或
BinaryXor( x, y ) 二进制异或
BigIntBitwiseOp( op, x, y )
BigInt::bitwiseAND( x, y ) 按位与
BigInt::bitwiseXOR( x, y ) 按位异或
BigInt::bitwiseOR( x, y ) 按位或
BigInt::toString( x )
'-'
和 !BigInt::toString( -x ) 的字符串拼接The text was updated successfully, but these errors were encountered: