6. Numbers (Numeri)
La rappresentazione dei numeri è simile a quella utilizzata nella maggior parte dei linguaggi di programmazione. Un numero è rappresentato in decimale, utilizzando cifre decimali. Contiene una parte intera, che può avere un prefisso di segno meno opzionale, seguita da una parte frazionaria e/o una parte esponente opzionali. Gli zeri iniziali non sono consentiti.
Una parte frazionaria (Fraction Part) è un punto decimale seguito da una o più cifre.
Una parte esponente (Exponent Part) inizia con la lettera E maiuscola o minuscola, seguita da un segno più o meno opzionale. La E e il segno opzionale sono seguiti da una o più cifre.
I valori numerici che non possono essere rappresentati nella sintassi (come Infinity e NaN) non sono consentiti.
number = [ minus ] int [ frac ] [ exp ]
decimal-point = %x2E ; .
digit1-9 = %x31-39 ; 1-9
e = %x65 / %x45 ; e E
exp = e [ minus / plus ] 1*DIGIT
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
minus = %x2D ; -
plus = %x2B ; +
zero = %x30 ; 0
Questa specifica consente alle implementazioni di impostare limiti sull'intervallo e sulla precisione dei numeri accettati. Poiché il software che implementa i numeri IEEE 754-2008 binary64 (doppia precisione) [IEEE754] è generalmente disponibile e ampiamente utilizzato, ci si aspetta che le implementazioni che non superano la precisione o l'intervallo forniti da questi possano raggiungere una buona interoperabilità, poiché le implementazioni approssimeranno i numeri JSON entro la precisione prevista. Numeri JSON come 1E400 o 3.141592653589793238462643383279 possono indicare potenziali problemi di interoperabilità, poiché suggeriscono che il software che li ha creati si aspetta che il software ricevente abbia capacità di intervallo e precisione numeriche maggiori di quelle generalmente disponibili.
Si noti che quando si utilizza tale software, gli interi nell'intervallo [-(253)+1, (253)-1] sono interoperabili, poiché le implementazioni determineranno i loro valori numerici in modo completamente coerente.