web-dev-qa-db-fra.com

Norme JSON - nombres à virgule flottante

Je me demande si la notation à virgule flottante suivante est une notation JSON valide:

"result":{"base_fee":1e-005}

ou faut-il remplacer la notation exposant par une notation décimale?

41
ThePiachu

Il est valide selon le format disponible sur json.org car les nombres peuvent éventuellement avoir un exposant de base 10 dénoté par un E, majuscule ou minuscule, un plus ou moins facultatif et un ou plusieurs chiffres.

image of JSON number format

68
Delan Azabani

C'est parfaitement valable, selon RFC 4627 RFC 7159 *:

La représentation des nombres est similaire à celle utilisée dans la plupart des langages de programmation. Un nombre contient un composant entier qui peut être préfixé par un signe moins facultatif, qui peut être suivi d'une partie fraction et/ou d'une partie exposant.

Les formes octales et hexagonales ne sont pas autorisées. Les zéros non significatifs ne sont pas autorisés.

Une partie fraction 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 facultatif sont suivis d'un ou plusieurs chiffres.

Les valeurs numériques qui ne peuvent pas être représentées sous forme de séquences de chiffres (telles que Infinity et NaN) ne sont pas autorisées.

Les exposants peuvent avoir des 0 en tête, mais pas la section entière:

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

* La norme RFC 7159 remplace la note d'information RFC 4627, mais la grammaire utilisée reste exactement la même.

12
Qantas 94 Heavy

Du point de vue JSON (et JavaScript), ces quatre chiffres

une) 100
b) 100.0
c) 1.0E+2
ré) 1E+2

ne sont que quatre façons d'écrire exactement le même nombre, dans des environnements où les entiers et les réels sont des types de nombres distincts, ils ne sont peut-être pas tous équivalents.

Et tandis que (a) signifie clairement un entier, et (b) un réel et (c) un réel également, le cas (d) est un peu ambigu: par exemple, en C, c'est un virgule flottante littéral (car il y a un exposant), mais dans Ada c'est un littéral entier (car il n'y a pas de point décimal).

Et dans ISO 6093: 1985 "Traitement de l'information - Représentation des valeurs numériques dans les chaînes de caractères pour l'échange d'informations", la dernière est invalide , tandis que les trois autres correspondent aux trois formats distinctifs NR1, NR2 et NR3 qui y sont définis.

Donc en général - en JSON ou ailleurs -, je préférerais et recommanderais toujours d'inclure un point décimal dans une représentation de chaîne décimale "scientifique" avec un exposant.

Et pour placer au moins un chiffre devant la virgule décimale (s'il y en a un), comme l'exige JSON (et Ada, mais pas C) et ISO 6093 le recommande (mais pas l'exige).

Juste pour éviter les malentendus (entre humains) ou les tracas d'échange de données (entre machines et programmes).

10
mrtnhfmnn