什么是JavaScript的最高整数值,数字可以达到而不会丢失精度?来源

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是JavaScript的最高整数值,数字可以达到而不会丢失精度?来源相关的知识,希望对你有一定的参考价值。

这是由语言定义的吗?是否有定义的最大值?在不同的浏览器中是不同的?

答案

+/- 9007199254740991

ECMA Section 8.5 - Numbers

注意,幅度不大于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_INTEGERNumber的静态属性,所以你总是将它用作Number.MAX_SAFE_INTEGER,而不是你创建的Number对象的属性。

浏览器兼容性

enter image description here

另一答案

在撰写本文时,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

来自the reference

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

但是,Bitwise operation are calculated on 32 bits ( 4 bytes ), meaning if you exceed 32bits shifts you will start loosing bits.

另一答案

当数量大于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的最高整数值,数字可以达到而不会丢失精度?来源的主要内容,如果未能解决你的问题,请参考以下文章

PDO 返回最高整数值且没有重复条目

一种接受 2 个整数值并返回一个数组的方法。 JavaScript [重复]

JavaScript四种数值取整方法

#yyds干货盘点#JavaScript - 浮点数值

为啥相等运算符适用于整数值,直到 128 数字? [复制]

获取包含 X 位数的最小和最大整数值