6. Numbers (Nombres)
La représentation des nombres est similaire à celle utilisée dans la plupart des langages de programmation. Un nombre est représenté en base 10 en utilisant des chiffres décimaux. Il contient une composante entière qui peut être préfixée par un signe moins optionnel, qui peut être suivie d'une partie fractionnaire et/ou d'une partie exposant. Les zéros de tête ne sont pas autorisés.
Une partie fractionnaire est un point décimal suivi d'un ou plusieurs chiffres.
Une partie exposant commence par la lettre E en majuscule ou minuscule, qui peut être suivie d'un signe plus ou moins. Le E et le signe optionnel sont suivis d'un ou plusieurs chiffres.
Les valeurs numériques qui ne peuvent pas être représentées dans la grammaire ci-dessous (telles que Infinity et NaN) ne sont pas autorisées.
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
Cette spécification permet aux implémentations de définir des limites sur la plage et la précision des nombres acceptés. Étant donné que les logiciels qui implémentent les nombres IEEE 754 binary64 (double précision) [IEEE754] sont généralement disponibles et largement utilisés, une bonne interopérabilité peut être obtenue par des implémentations qui n'attendent pas plus de précision ou de plage que ce qu'ils fournissent, dans le sens où les implémentations approximeront les nombres JSON dans la précision attendue. Un nombre JSON tel que 1E400 ou 3.141592653589793238462643383279 peut indiquer des problèmes d'interopérabilité potentiels, car il suggère que le logiciel qui l'a créé s'attend à ce que le logiciel de réception ait des capacités supérieures pour la magnitude numérique et la précision que ce qui est largement disponible.
Notez que lorsqu'un tel logiciel est utilisé, les nombres qui sont des entiers et qui sont dans la plage [-(253)+1, (253)-1] sont interopérables dans le sens où les implémentations seront exactement d'accord sur leurs valeurs numériques.