Qual è il valore intero più alto di JavaScript a cui un numero può accedere senza perdere precisione?


951

Questo è definito dalla lingua? C'è un massimo definito? È diverso nei diversi browser?


5
Non è necessario dipendere dai limiti di JS con librerie come github.com/MikeMcl/big.js , vedere ad esempio qui per i suoi test di affidabilità
Dmitri Zaitsev,

2
qual è il valore intero più alto che puoi usare con big.js?
George,

@George Ecco l'API di big.js: mikemcl.github.io/big.js/#dp
simhumileco,

La domanda non ha senso. Che cosa significa che un numero "va a" un valore intero? Se vuoi solo chiedere quale sia il numero intero più alto che puoi rappresentare in JS, il numero più alto (finito) stesso è un numero intero.
Veky,

@DmitriZaitsev Non abbiamo più bisogno di dipendere da librerie esterne (almeno su alcuni browser). 1n << 10000nè un numero intero veramente grande, senza perdere precisione, senza richiedere dipendenze (e inutile dirlo, nemmeno vicino a un limite).
Amadan,

Risposte:


868

JavaScript ha due tipi di numeri: Numbere BigInt.

Il tipo di numero più frequentemente utilizzato Numberè un numero IEEE 754 a virgola mobile a 64 bit .

Il valore integrale esatto più grande di questo tipo è Number.MAX_SAFE_INTEGER, che è:

  • 2 53 -1, oppure
  • +/- 9.007.199.254.740.991, o
  • nove quadrilioni sette trilioni centonovantanove duecento cinquantaquattro milioni settecento quaranta migliaia novecento novantuno

Per dirla in prospettiva: un quadrilione di byte è un petabyte (o mille terabyte).

"Sicuro" in questo contesto si riferisce alla capacità di rappresentare esattamente i numeri interi e di confrontarli correttamente.

Dalle specifiche:

Si noti che tutti i numeri interi positivi e negativi la cui magnitudine non è maggiore di 2 53 sono rappresentabili nel Numbertipo (in effetti, l'intero 0 ha due rappresentazioni, +0 e -0).

Per utilizzare in modo sicuro numeri interi più grandi di questo, è necessario utilizzare BigInt, che non ha limite superiore.

Si noti che gli operatori bit a bit e gli operatori shift funzionano su numeri interi a 32 bit, quindi in questo caso, il numero intero massimo di sicurezza è 2 31 -1 o 2.147.483.647.

const log = console.log
var x = 9007199254740992
var y = -x
log(x == x + 1) // true !
log(y == y - 1) // also true !

// Arithmetic operators work, but bitwise/shifts only operate on int32:
log(x / 2)      // 4503599627370496
log(x >> 1)     // 0
log(x | 1)      // 1


Nota tecnica sull'argomento del numero 9.007.199.254.740.992: esiste una rappresentazione IEEE-754 esatta di questo valore e puoi assegnare e leggere questo valore da una variabile, quindi per applicazioni scelte con molta attenzione nel dominio di numeri interi inferiori o uguali a questo valore, potresti considerarlo come un valore massimo.

Nel caso generale, è necessario considerare questo valore IEEE-754 come inesatto, perché è ambiguo se sta codificando il valore logico 9.007.199.254.740.992 o 9.007.199.254.740.993.


75
Sembra giusto, ma c'è un posto in cui è definito, come MAX_INT di C o Integer di Java.MAX_VALUE?
TALlama,

48
4294967295 === Math.pow(2,32) - 1;
CoolAJ86,

13
Quindi qual è il numero intero più piccolo e più grande che possiamo usare per garantire la precisione esatta?
Pacerier,

38
Forse vale la pena notare che non esiste (int) reale in JavaScript. Ogni istanza di Number è (float) o NaN.
Beetroot-Beetroot

53
9007199254740992 non è in realtà il valore massimo, l'ultimo bit qui è già considerato zero e quindi hai perso 1 bit di precisione. Il vero numero sicuro è 9007199254740991 (Number.MAX_SAFE_INTEGER)
Willem D'Haeseleer

461

> = ES6:

Number.MIN_SAFE_INTEGER;
Number.MAX_SAFE_INTEGER;

<= ES5

Dal riferimento :

Number.MAX_VALUE;
Number.MIN_VALUE;


23
Ho modificato la domanda per essere un po 'più precisi riguardo al volere i valori Numero intero massimo, non solo il valore Numero massimo. Ci scusiamo per la confusione, qui.
TALlama,

5
Il risultato restituito è garantito uguale su tutti i browser?
Pacerier,

7
Si noti che Number.MIN_VALUEè il numero positivo più piccolo possibile . Il valore minimo (ovvero inferiore a qualsiasi altra cosa) è probabilmente -Number.MAX_VALUE.
Michael Scheper,

34
ES6 introduce Number.MIN_SAFE_INTEGEReNumber.MAX_SAFE_INTEGER
superlukas il

2
Quindi, in questo caso, dovremmo votare la risposta perché è errata per la domanda aggiornata o lasciarla perché Peter Baily aveva ragione nel momento in cui è stata data risposta?
rocketsarefast,

112

È 2 53 == 9 007 199 254 740 992. Questo perché Numbers sono memorizzati come virgola mobile in una mantissa a 52 bit.

Il valore minimo è -2 53 .

Questo rende alcune cose divertenti accadendo

Math.pow(2, 53) == Math.pow(2, 53) + 1
>> true

E può anche essere pericoloso :)

var MAX_INT = Math.pow(2, 53); // 9 007 199 254 740 992
for (var i = MAX_INT; i < MAX_INT + 2; ++i) {
    // infinite loop
}

Ulteriori letture: http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html


1
anche se non si arriverebbe mai alla fine di questo per un ciclo in un lasso di tempo sano, potresti voler direi += 1000000000
ninjagecko

2
@ninjagecko, inizia da MAX_INT, quindi la fine è proprio lì. Anche l'utilizzo di i + = 1000000000 non lo renderebbe più un ciclo infinito. Provalo.
Ted Bigham,

@TedBigham: Ah oops, ero pronto troppo in fretta. Grazie per avermi corretto due volte.
ninjagecko,

Vedi l'argomento di Jimmy per 9.007.199.254.740.991 anziché 9.007.199.254.740.992 qui . Ciò, combinato con il mio seguito, sembra convincente.
TJ Crowder,

60

In JavaScript, c'è un numero chiamato Infinity.

Esempi:

(Infinity>100)
=> true

// Also worth noting
Infinity - 1 == Infinity
=> true

Math.pow(2,1024) === Infinity
=> true

Questo può essere sufficiente per alcune domande su questo argomento.


25
Qualcosa mi dice che l'infinito non si qualifica come intero. :)
devios1

7
Ma è abbastanza buono per inizializzare una minvariabile quando stai cercando un valore minimo.
Djjeck,

9
Nota cheInfinity - 1 === Infinity
H.Wolper,

2
anche (Infinity <100) => false e Math.pow (2,1024) === Infinity
Sijav

6
Inoltre non vale nulla che gestisca anche l'Infinito negativo. Quindi1 - Infinity === -Infinity
dmccabe,

41

La risposta di Jimmy rappresenta correttamente lo spettro intero JavaScript continuo compreso tra -9007199254740992 e 9007199254740992 inclusi (scusate 9007199254740993, potreste pensare di essere 9007199254740993, ma vi sbagliate! Dimostrazione sotto o in jsfiddle ).

console.log(9007199254740993);

Tuttavia, non esiste una risposta che lo trovi / dimostri in modo programmatico (diverso da quello di CoolAJ86 alluso nella sua risposta che sarebbe terminata in 28.56 anni;), quindi ecco un modo leggermente più efficiente per farlo (per essere precisi, è più efficiente di circa 28.559999999968312 anni :), insieme a un violino di prova :

/**
 * Checks if adding/subtracting one to/from a number yields the correct result.
 *
 * @param number The number to test
 * @return true if you can add/subtract 1, false otherwise.
 */
var canAddSubtractOneFromNumber = function(number) {
    var numMinusOne = number - 1;
    var numPlusOne = number + 1;
    
    return ((number - numMinusOne) === 1) && ((number - numPlusOne) === -1);
}

//Find the highest number
var highestNumber = 3; //Start with an integer 1 or higher

//Get a number higher than the valid integer range
while (canAddSubtractOneFromNumber(highestNumber)) {
    highestNumber *= 2;
}

//Find the lowest number you can't add/subtract 1 from
var numToSubtract = highestNumber / 4;
while (numToSubtract >= 1) {
    while (!canAddSubtractOneFromNumber(highestNumber - numToSubtract)) {
        highestNumber = highestNumber - numToSubtract;
    }
    
    numToSubtract /= 2;
}        

//And there was much rejoicing.  Yay.    
console.log('HighestNumber = ' + highestNumber);


8
@ CoolAJ86: Lol, non vedo l'ora che arrivi il 15 marzo 2040. Se i nostri numeri corrispondono dovremmo organizzare una festa :)
Briguy37

var x = Math.pow (2,53) -3; while (x! = x + 1) x ++; -> 9007199254740991
MickLH

@MickLH: ottengo 9007199254740992 con quel codice . Quale motore JavaScript stai usando per testare?
Briguy37,

Ottieni 9007199254740992 con il tuo codice, non ho usato il valore finale di x, ma l'evacuazione finale di x ++ per motivi paranoici. Google Chrome tra l'altro.
MickLH,

@MickLH: la valutazione x++ti dà il valore di x prima che si sia verificato l'incremento, quindi questo probabilmente spiega la discrepanza. Se vuoi che l'espressione valga la stessa cosa del valore finale di x, dovresti cambiarla in ++x.
peterflynn,

32

Per essere al sicuro

var MAX_INT = 4294967295;

Ragionamento

Ho pensato di essere intelligente e trovare il valore con cui x + 1 === xcon un approccio più pragmatico.

La mia macchina può contare solo 10 milioni al secondo o giù di lì ... quindi rispedirò con la risposta definitiva tra 28,56 anni.

Se non puoi aspettare così a lungo, sono disposto a scommetterlo

  • La maggior parte dei tuoi loop non dura 28,56 anni
  • 9007199254740992 === Math.pow(2, 53) + 1 è abbastanza prova
  • È necessario attenersi a 4294967295ciò Math.pow(2,32) - 1per evitare problemi previsti con lo spostamento dei bit

Alla ricerca x + 1 === x:

(function () {
  "use strict";

  var x = 0
    , start = new Date().valueOf()
    ;

  while (x + 1 != x) {
    if (!(x % 10000000)) {
      console.log(x);
    }

    x += 1
  }

  console.log(x, new Date().valueOf() - start);
}());

4
non puoi semplicemente avviarlo a 2 ^ 53 - 2 per testarlo? (sì, puoi, l'ho appena provato, anche con -3 per sicurezza: var x = Math.pow (2,53) -3; while (x! = x + 1) x ++;) -> 9007199254740991
MickLH

Bella risposta! Inoltre, so che il valore è definito, ma perché non usare la ricerca binaria per la sua ricerca?
higuaro,

1
Qual è il divertimento in questo? Inoltre, @ Briguy37 mi battuto sul tempo: stackoverflow.com/a/11639621/151312
CoolAJ86

notare che questo MAX_INT "sicuro" basato su 32 bit non funzionerà se confrontato con i valori di Data. 4294967295 è così ieri!
Jerry,

1
La risposta "Per essere sicuri: var MAX_INT = 4294967295;" non è divertente. Se non stai cambiando i bit, non preoccuparti (a meno che tu non abbia bisogno di un int maggiore di 4294967295, nel qual caso dovresti probabilmente memorizzarlo come una stringa e usare una libreria bigint).
CoolAJ86,

29

La risposta breve è "dipende".

Se si utilizzano operatori bit a bit ovunque (o se si fa riferimento alla lunghezza di un array), gli intervalli sono:

uNSIGNED: 0…(-1>>>0)

firmato: (-(-1>>>1)-1)…(-1>>>1)

(Succede che gli operatori bit a bit e la lunghezza massima di un array sono limitati a numeri interi a 32 bit.)

Se non si utilizzano operatori bit per bit o non si lavora con lunghezze di array:

firmato: (-Math.pow(2,53))…(+Math.pow(2,53))

Queste limitazioni sono imposte dalla rappresentazione interna del tipo "Numero", che generalmente corrisponde alla rappresentazione in virgola mobile a precisione doppia IEEE 754. (Si noti che a differenza dei numeri interi con segno tipici, l'entità del limite negativo è uguale all'entità del limite positivo, a causa delle caratteristiche della rappresentazione interna, che in realtà include uno 0 negativo !)


Questa è la risposta che volevo incontrare su come convertire X in un intero a 32 bit o intero senza segno. Ho votato per la tua risposta.
Charlie Affumigato,

29

ECMAScript 6:

Number.MAX_SAFE_INTEGER = Math.pow(2, 53)-1;
Number.MIN_SAFE_INTEGER = -Number.MAX_SAFE_INTEGER;

1
Attenzione, questo non è (ancora) supportato da tutti i browser! Oggi a iOS (nemmeno Chrome), Safari e IE non piacciono.
cregox,

5
Leggere attentamente la risposta, non stiamo usando l'implementazione predefinita di Number.MAX_SAFE_INTEGER in ECMAScript 6, la stiamo definendo da Math.pow (2, 53) -1
WaiKit Kung

Ho pensato che fosse solo un riferimento a come è implementato in ECMA 6! : PI penso che il mio commento sia comunque valido. Tutta una questione di contesto. ;)
cregox,

3
È affidabile calcolare MAX_SAFE_INTEGERin tutti i browser lavorando all'indietro? Dovresti invece andare avanti? Vale a dire, Number.MAX_SAFE_INTEGER = 2 * (Math.pow (2, 52) - 1) + 1;
kjv,

È Math.pow(2, 53)-1un'operazione sicura? Va uno più grande del più grande intero sicuro.
ioquatix,

21

Molte risposte di epoche precedenti hanno mostrato il risultato truedi 9007199254740992 === 9007199254740992 + 1verificare che 9 007 199 254 740 991 sia il numero intero massimo e sicuro.

E se continuiamo a fare accumulazione:

input: 9007199254740992 + 1  output: 9007199254740992  // expected: 9007199254740993
input: 9007199254740992 + 2  output: 9007199254740994  // expected: 9007199254740994
input: 9007199254740992 + 3  output: 9007199254740996  // expected: 9007199254740995
input: 9007199254740992 + 4  output: 9007199254740996  // expected: 9007199254740996

Potremmo scoprire che tra i numeri maggiori di 9 007 199 254 740 992 , sono rappresentabili solo i numeri pari .

È un'entrata per spiegare come funziona il formato binario a doppia precisione a 64 bit . Vediamo come 9 007 199 254 740 992 devono essere mantenuti (rappresentati) usando questo formato binario.

Utilizzando una breve versione per dimostrarlo da 4 503 599 627 370 496 :

  1 . 0000 ---- 0000  *  2^52            =>  1  0000 ---- 0000.  
     |-- 52 bits --|    |exponent part|        |-- 52 bits --|

Sul lato sinistro della freccia, abbiamo il valore di bit 1 e un punto radix adiacente , quindi moltiplicando 2^52spostiamo a destra il punto radix di 52 passi e arriva alla fine. Ora otteniamo 4503599627370496 in binario.

Ora iniziamo ad accumulare 1 su questo valore fino a quando tutti i bit sono impostati su 1, che equivale a 9 007 199 254 740 991 in decimale.

  1 . 0000 ---- 0000  *  2^52  =>  1  0000 ---- 0000.  
                       (+1)
  1 . 0000 ---- 0001  *  2^52  =>  1  0000 ---- 0001.  
                       (+1)
  1 . 0000 ---- 0010  *  2^52  =>  1  0000 ---- 0010.  
                       (+1)
                        . 
                        .
                        .
  1 . 1111 ---- 1111  *  2^52  =>  1  1111 ---- 1111. 

Ora, poiché in formato binario a 64 bit a doppia precisione , assegna rigorosamente 52 bit per frazione, non è più disponibile alcun bit da aggiungere per aggiungere un altro 1, quindi ciò che possiamo fare è riportare tutti i bit su 0, e manipolare la parte esponente:

  |--> This bit is implicit and persistent.
  |        
  1 . 1111 ---- 1111  *  2^52      =>  1  1111 ---- 1111. 
     |-- 52 bits --|                     |-- 52 bits --|

                          (+1)
                                     (radix point has no way to go)
  1 . 0000 ---- 0000  *  2^52 * 2  =>  1  0000 ---- 0000. * 2  
     |-- 52 bits --|                     |-- 52 bits --|

  =>  1 . 0000 ---- 0000  *  2^53 
         |-- 52 bits --| 

Ora otteniamo il 9 007 199 254 740 992 , e con il numero maggiore di esso, ciò che il formato potrebbe contenere è 2 volte della frazione , significa che ora ogni 1 aggiunta sulla parte della frazione equivale effettivamente a 2 aggiunte, ecco perché il doppio -precisione formato binario a 64 bit non può contenere numeri dispari quando il numero è maggiore di 9 007 199 254 740 992 :

                            (consume 2^52 to move radix point to the end)
  1 . 0000 ---- 0001  *  2^53  =>  1  0000 ---- 0001.  *  2
     |-- 52 bits --|                 |-- 52 bits --|

Quindi, quando il numero arriva a maggiore di 9 007 199254 740 992 * 2 = 18014398509 481 984, potrebbero essere mantenute solo 4 volte della frazione :

input: 18014398509481984 + 1  output: 18014398509481984  // expected: 18014398509481985
input: 18014398509481984 + 2  output: 18014398509481984  // expected: 18014398509481986
input: 18014398509481984 + 3  output: 18014398509481984  // expected: 18014398509481987
input: 18014398509481984 + 4  output: 18014398509481988  // expected: 18014398509481988

Che ne dici di un numero compreso tra [ 2 251 799 813 685 248 , 4 503 599 627 370 496 )?

 1 . 0000 ---- 0001  *  2^51  =>  1 0000 ---- 000.1
     |-- 52 bits --|                |-- 52 bits  --|

Il valore di bit 1 dopo il punto di radice è esattamente 2 ^ -1. (= 1/2, = 0,5) Quindi quando il numero inferiore a 4 503 599 627 370 496 (2 ^ 52), è disponibile un bit per rappresentare le 1/2 volte dell'intero :

input: 4503599627370495.5   output: 4503599627370495.5  
input: 4503599627370495.75  output: 4503599627370495.5  

Meno di 2 251 799 813 685 248 (2 ^ 51)

input: 2251799813685246.75   output: 2251799813685246.8  // expected: 2251799813685246.75 
input: 2251799813685246.25   output: 2251799813685246.2  // expected: 2251799813685246.25 
input: 2251799813685246.5    output: 2251799813685246.5

// If the digits exceed 17, JavaScript round it to print it.
//, but the value is held correctly:

input: 2251799813685246.25.toString(2) 
output: "111111111111111111111111111111111111111111111111110.01"
input: 2251799813685246.75.toString(2) 
output: "111111111111111111111111111111111111111111111111110.11"
input: 2251799813685246.78.toString(2)   
output: "111111111111111111111111111111111111111111111111110.11"

E qual è la gamma disponibile di parte esponente ? il formato assegna 11 bit per esso. Formato completo da Wiki : (Per maggiori dettagli, vai lì)

IEEE 754 Double Floating Point Format.svg

inserisci qui la descrizione dell'immagine

Quindi, per fare in modo che la parte esponente sia 2 ^ 52, dobbiamo esattamente impostare e = 1075.


13

Altri potrebbero aver già dato la risposta generica, ma ho pensato che sarebbe una buona idea dare un modo veloce per determinarla:

for (var x = 2; x + 1 !== x; x *= 2);
console.log(x);

Il che mi dà 9007199254740992 in meno di un millisecondo in Chrome 30.

Testerà i poteri di 2 per trovare quale, quando "aggiunto" 1, è uguale a se stesso.


Potrebbe causare un arresto anomalo dell'applicazione, si pensava.
Sapphire_Brick del

8

Tutto ciò che si desidera utilizzare per operazioni bit a bit deve essere compreso tra 0x80000000 (-2147483648 o -2 ^ 31) e 0x7fffffff (2147483647 o 2 ^ 31 - 1).

La console ti dirà che 0x80000000 è uguale a +2147483648, ma 0x80000000 e 0x80000000 è uguale a -2147483648.


6

Provare:

maxInt = -1 >>> 1

In Firefox 3.6 sono 2 ^ 31 - 1.


2
@danorton: Non sono sicuro che tu capisca cosa stai facendo. ^significa elevato al potere . Nella console javascript, ^è XOR , non elevato a
kumarharsh il

2
aprire la console di Chrome / Firefox. Digitare 5 ^ 2. In binario, 5 è 101e 2 è 010. Ora, se li bitorali XOR, riceverai 5(101) ^ 2(010) = 7(111) LEGGI QUESTO SE SEI CONFUSO Ciò che viene discusso qui Math.pow()non è l' ^operatore
kumarharsh,

3
Ancora una volta, non sono affatto confuso. Ho commentato e declassato ciò che è scritto . Se Math.pow () è ciò che si intende, allora è quello che dovrebbe essere scritto. In una risposta a una domanda su JavaScript, è inappropriato utilizzare la sintassi di una lingua diversa. È ancora più inappropriato utilizzare una sintassi valida in JavaScript, ma con un'interpretazione in JavaScript che abbia un significato diverso da quello previsto.
Danorton,

10
2 ^ 31 è il modo in cui si scrive due alla trentunesima potenza in inglese. Non è in un blocco di codice. Ti lamenteresti di qualcuno che usa un; in una risposta, perché è un personaggio con un significato diverso in Javascript?
mmm

3
Anche se si dovrebbe scrivere 2³¹ e non 2 ^ 31 in testo normale, è comune farlo, perché la maggior parte dei layout di tastiera non ha quei caratteri per impostazione predefinita. Almeno non ho avuto problemi a capire cosa si intendesse in questa risposta.
Jocke,

6

Al momento della scrittura, Javascript sta ricevendo un nuovo tipo di dati: BigInt. È una proposta TC39 nella fase 4 da includere in EcmaScript 2020 . BigIntè disponibile in Chrome 67+, FireFox 68+, Opera 54 e Nodo 10.4.0. È in corso in Safari, et al ... Introduce letterali numerici con il suffisso "n" e consente una precisione arbitraria:

var a = 123456789012345678901012345678901n;

La precisione andrà comunque persa, ovviamente, quando un tale numero viene (forse involontariamente) costretto a un tipo di dati numerici.

E, ovviamente, ci saranno sempre limiti di precisione dovuti alla memoria finita e un costo in termini di tempo per allocare la memoria necessaria ed eseguire l'aritmetica su numeri così grandi.

Ad esempio, la generazione di un numero con centomila cifre decimali richiederà un notevole ritardo prima del completamento:

console.log(BigInt("1".padEnd(100000,"0")) + 1n)

... ma funziona.


4

Ho fatto un semplice test con una formula, X- (X + 1) = - 1, e il valore più grande di XI che può funzionare su Safari, Opera e Firefox (testato su OS X) è 9e15. Ecco il codice che ho usato per i test:

javascript: alert(9e15-(9e15+1));

1
Nota che 9e15 = 2 ^ 53 (vedi la risposta di @Jimmy).
Wed

6
9e15 = 9000000000000000. 2 ^ 53 = 9007199254740992. Pertanto, per essere pedante, 9e15 è solo approssimativamente uguale a 2 ^ 53 (con due cifre significative).
devios1,

@chaiguy In 9000000000000000c'è 1 cifra significativa. in "9007199254740992" ci sono 15 cifre significative.
Royi Namir,

@RoyiNamir Non volendo iniziare un argomento inutile qui, ma 9000000000000000 ha 16 cifre significative. Se vuoi solo 1, dovrebbe essere scritto come 9x10 ^ 15.
devios1

1
@chaiguy No. 9000000000000000com'è - ha 1SF. dove 90*10^14ha 2. ( sigfigscalculator.appspot.com ) & mathsfirst.massey.ac.nz/Algebra/Decimals/SigFig.htm (sezione in basso)
Royi Namir

3

Lo scrivo così:

var max_int = 0x20000000000000;
var min_int = -0x20000000000000;
(max_int + 1) === 0x20000000000000;  //true
(max_int - 1) < 0x20000000000000;    //true

Lo stesso per int32

var max_int32 =  0x80000000;
var min_int32 = -0x80000000;

3

Andiamo alle fonti

Descrizione

La MAX_SAFE_INTEGERcostante ha un valore di 9007199254740991(9.007.199.254.740.991 o ~ 9 quadrilioni). Il ragionamento alla base di quel numero è che JavaScript utilizza numeri in formato a virgola mobile a precisione doppia come specificato in IEEE 754 e può rappresentare in modo sicuro solo numeri tra -(2^53 - 1)e 2^53 - 1.

Sicuro in questo contesto si riferisce alla capacità di rappresentare esattamente i numeri interi e di confrontarli correttamente. Ad esempio, Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2valuterà true, il che è matematicamente errato. Vedere Number.isSafeInteger () per ulteriori informazioni.

Poiché MAX_SAFE_INTEGERè una proprietà statica di Number , la usi sempre come Number.MAX_SAFE_INTEGER, anziché come proprietà di un oggetto Number che hai creato.

Compatibilità del browser

inserisci qui la descrizione dell'immagine




-1

Scato scrive:

tutto ciò che si desidera utilizzare per operazioni bit a bit deve essere compreso tra 0x80000000 (-2147483648 o -2 ^ 31) e 0x7fffffff (2147483647 o 2 ^ 31 - 1).

la console ti dirà che 0x80000000 è uguale a +2147483648, ma 0x80000000 e 0x80000000 è uguale a -2147483648

I decimali esadecimali sono valori positivi senza segno, quindi 0x80000000 = 2147483648 - questo è matematicamente corretto. Se vuoi renderlo un valore con segno devi spostare a destra: 0x80000000 >> 0 = -2147483648. Puoi anche scrivere 1 << 31.


-7

Firefox 3 non sembra avere problemi con numeri enormi.

1e + 200 * 1e + 100 calcolerà la multa fino a 1e + 300.

Anche Safari sembra non avere problemi. (Per la cronaca, questo è su un Mac se qualcun altro decide di testarlo.)

A meno che non abbia perso la testa in questo momento della giornata, questo è molto più grande di un intero a 64 bit.


18
non è un numero intero a 64 bit, è un numero in virgola mobile a 64 bit, di cui 52/53 bit sono la parte intera. quindi gestirà fino a 1e300, ma non con la precisione esatta.
Jimmy,

4
Jimmy ha ragione. Prova questo nel tuo browser o nella riga di comando di JS:100000000000000010 - 1 => 100000000000000020
Ryan,

-7

Node.js e Google Chrome sembrano entrambi utilizzare valori in virgola mobile a 1024 bit, quindi:

Number.MAX_VALUE = 1.7976931348623157e+308

1
-1: il numero massimo rappresentabile (integrale non esatto) può essere ~ 2 ^ 1024, ma ciò non significa che si stiano discostando dallo standard IEEE-754 a 64 bit.
Roy Tinker,

2
MAX_INT? Intendi MAX_VALUE?
Raul Guiu

3
questo è il massimo di un valore in virgola mobile . Ciò non significa che è possibile memorizzare un int così a lungo
phuclv

1
O più al punto, non è possibile archiviare in modo affidabile un int così a lungo senza perdita di precisione . 2^53viene chiamato MAX_SAFE_INTperché sopra quel punto i valori diventano approssimazioni, allo stesso modo delle frazioni.
IMSoP,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.