什么是JavaScript的最高整数值,数字可以达到而不会丢失精度?来源
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是JavaScript的最高整数值,数字可以达到而不会丢失精度?来源相关的知识,希望对你有一定的参考价值。
这是由语言定义的吗?是否有定义的最大值?在不同的浏览器中是不同的?
+/- 9007199254740991
注意,幅度不大于253的所有正整数和负整数都可以在Number类型中表示(实际上,整数0有两个表示,+ 0和-0)。
它们是64位浮点值,最大精确积分值是253-1,或9007199254740991
。在ES6中,这被定义为Number.MAX_SAFE_INTEGER。
请注意,按位运算符和移位运算符以32位整数运算,因此在这种情况下,最大安全整数为231-1或2147483647。
Test it out!
var x = 9007199254740992;
var y = -x;
x == x + 1; // true !
y == y - 1; // also true !
// Arithmetic operators work, but bitwise/shifts only operate on int32:
x / 2; // 4503599627370496
x >> 1; // 0
x | 1; // 1
有关数字9007199254740992的主题的技术说明:该值有一个精确的IEEE-754表示,您可以从变量中分配和读取该值,因此对于小于或等于整数域的非常谨慎选择的应用程序此值,您可以将其视为最大值。
在一般情况下,您必须将此IEEE-754值视为不精确,因为它是否编码逻辑值9007199254740992或9007199254740993是不明确的。
其他人可能已经给出了通用答案,但我认为快速确定它是一个好主意:
for (var x = 2; x + 1 !== x; x *= 2);
console.log(x);
在Chrome 30中,我在不到一毫秒的时间内就获得了9007199254740992。
它将测试2的幂,以找到哪一个,当'添加'1时,等于他自己。
您想要用于按位运算的任何内容必须介于0x80000000(-2147483648或-2 ^ 31)和0x7fffffff(2147483647或2 ^ 31-1)之间。
控制台将告诉您0x80000000等于+2147483648,但0x80000000和0x80000000等于-2147483648。
尝试:
maxInt = -1 >>> 1
在Firefox 3.6中它是2 ^ 31 - 1。
我用公式做了一个简单的测试,X-(X + 1)= - 1,X的最大值可以在Safari上运行,Opera和Firefox(在OS X上测试)是9e15。这是我用于测试的代码:
javascript: alert(9e15-(9e15+1));
在Google Chrome内置的javascript中,您可以在数字被称为无限之前转到大约2 ^ 1024。
我这样写:
var max_int = 0x20000000000000;
var min_int = -0x20000000000000;
(max_int + 1) === 0x20000000000000; //true
(max_int - 1) < 0x20000000000000; //true
对于int32也是如此
var max_int32 = 0x80000000;
var min_int32 = -0x80000000;
Let's get to the sources
描述
MAX_SAFE_INTEGER
常数的值为9007199254740991
(9,007,199,254,740,991或~9千万亿)。这个数字背后的原因是JavaScript使用double-precision floating-point format numbers中指定的IEEE 754,并且只能安全地表示-(253 - 1)
和253 - 1
之间的数字。在这种情况下,安全是指能够准确表示整数并正确比较它们的能力。例如,
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2
将评估为true,这在数学上是不正确的。有关更多信息,请参阅Number.isSafeInteger()。因为
MAX_SAFE_INTEGER
是Number的静态属性,所以你总是将它用作Number.MAX_SAFE_INTEGER
,而不是你创建的Number对象的属性。
浏览器兼容性
在撰写本文时,JavaScript正在接收一种新的数据类型:BigInt
。这是stage 3的TC39提案。 BigInt
有Chrome 67+,FireFox 67+(需要激活选项),Opera 54和Node 10.4.0。 Safari正在进行中......它引入了具有“n”后缀的数字文字并允许任意精度:
var a = 123456789012345678901012345678901n;
当然,当这样的数字(可能是无意地)被强制转换为数字数据类型时,精度仍然会丢失。
Scato wrotes:
您想要用于按位运算的任何内容必须介于0x80000000(-2147483648或-2 ^ 31)和0x7fffffff(2147483647或2 ^ 31-1)之间。
控制台会告诉你0x80000000等于+2147483648,但0x80000000和0x80000000等于-2147483648
十六进制小数是无符号正值,因此0x80000000 = 2147483648 - 这在数学上是正确的。如果要使其成为有符号值,则必须右移:0x80000000 >> 0 = -2147483648。你也可以写1 << 31。
Number.MAX_VALUE表示JavaScript中可表示的最大数值。
由于似乎没有人这样说过,在v8引擎中,31 bits
数字和数字的行为存在差异。
如果您有32 bits
,您可以使用第一位告诉javascript引擎该数据是什么类型,并使剩余的位包含实际数据。这就是V8作为31 bis
numbers
的一个小优化所做的事情(或曾经做过,我的消息来源很陈旧)。你有最后一个31 bits
是数字值,然后第一个位告诉引擎它是一个数字还是一个对象引用。
但是,如果您使用31 bits
以上的数字,那么数据将不适合,数字将以64位双重加框,并且优化不会存在。
在下面的视频中,底线是:
更喜欢可以表示为31位有符号整数的数值。
> = ES6:
Number.MIN_SAFE_INTEGER;
Number.MAX_SAFE_INTEGER;
<= ES5
Number.MAX_VALUE;
Number.MIN_VALUE;
console.log('MIN_VALUE', Number.MIN_VALUE);
console.log('MAX_VALUE', Number.MAX_VALUE);
console.log('MIN_SAFE_INTEGER', Number.MIN_SAFE_INTEGER); //ES6
console.log('MAX_SAFE_INTEGER', Number.MAX_SAFE_INTEGER); //ES6
基本上javascript不支持很长时间。
所以对于它可以表示小于32位的正常值,它将使用int类型容器。对于大于32位的整数值,它使用double。在双重复位中,整数部分为53位,其余为尾数(以保持浮点信息)。
所以你可以使用2^53 - 1
,其价值是9007199254740991
您可以通过Number.MAX_SAFE_INTEGER
访问代码中使用的值
在JavaScript中,数字的表示是2^53 - 1
。
当数量大于2时,功率53即。
Math.pow(2, 53)
javascript知道它是一个大整数。然后javascript将它们存储为'bigint',因此与'bigint'==='bigint'
相比变为真。
将数值存储在Math对象本身的更安全的方法。
const bigInt1 = Math.pow(2, 55)
const bigInt2 = Math.pow(2, 66)
console.log(bigInt1 === bigInt2) // false
Node.js和Google Chrome似乎都使用1024位浮点值,因此:
Number.MAX_VALUE = 1.7976931348623157e+308
Firefox 3似乎没有大数字的问题。
1e + 200 * 1e + 100将精确计算为1e + 300。
Safari似乎也没有任何问题。 (据记录,如果其他人决定对此进行测试,这是在Mac上。)
除非我在一天的这个时候失去了大脑,否则这比64位整
以上是关于什么是JavaScript的最高整数值,数字可以达到而不会丢失精度?来源的主要内容,如果未能解决你的问题,请参考以下文章