JSON standard des nombres à virgule flottante

je me demande si la notation flottante suivante est une notation JSON valide:

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

ou la notation exposant doit-elle être remplacée par une notation décimale?

33
demandé sur ks1322 2013-10-24 04:50:35

3 réponses

il est valide selon le format disponible à json.org comme les nombres peuvent avoir optionnellement une base 10 exposant dénoté par un E, majuscule ou minuscule, un plus ou moins optionnel, et un ou plusieurs chiffres.

image of JSON number format

59
répondu Delan Azabani 2013-10-24 00:52:33

C'est parfaitement valide, d'après RFC 4627 RFC 7159*:

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

Les formulaires Octal et hex ne sont pas autorisés. Les zéros de tête ne sont pas autorisés.

Une fraction est un point décimal suivi par un ou plusieurs chiffres.

une partie exposant commence par la lettre E en majuscules ou minuscules, qui peut être suivie par un signe plus ou moins. Le E et optionnel signe sont suivies par un ou plusieurs chiffres.

valeurs numériques qui ne peuvent pas être représentées par des séquences de chiffres (tels que L'infini et NaN) ne sont pas autorisés.

les Exposants sont autorisés à avoir leader 0s, mais pas l'entier de la section:

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 demeure exactement la même.

11
répondu Qantas 94 Heavy 2014-10-29 10:23:02

D'un point de vue JSON (et JavaScript) ces quatre chiffres

a)100

b)100.0

c) 1.0E+2

d)1E+2

sont seulement quatre façons d'écrire le même nombre exact, dans les environnements où les entiers et les réals sont des types distincts de nombres ils pourraient ne pas tous être équivalents.

Et tandis que (un) signifie clairement un entier, et (b), et (c) une réelle ainsi, le cas (d) est un peu ambigu: pour exemple, en C ceci est un virgule flottante littérale (parce qu'il y a un exposant), mais dans Ada C'est un entier littéral (parce qu'il n'y a pas de point décimal).

Et ISO 6093: 1985 "traitement de l'Information – Représentation des valeurs numériques en chaînes de caractères, pour l'échange de l'information", le dernier est valide, alors que les trois autres correspondent aux trois formats distincts NR1, NR2 et NR3 définis y.

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

et de placer au moins un chiffre en avant du point décimal (s'il y en a un), comme L'exigent JSON (et Ada, mais pas C) et la norme ISO 6093 (mais pas obligatoire).

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

8
répondu mrtnhfmnn 2016-12-11 05:42:20