JSON standard-números en coma flotante


Me pregunto si la siguiente notación de coma flotante es una notación JSON válida:

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

¿O debería reemplazarse la notación exponente por una notación decimal?

Author: ks1322, 2013-10-24

3 answers

Es válido según el formato disponible en json.org como números pueden opcionalmente tener un exponente base 10 denotado por una E, mayúscula o minúscula, un más o menos opcional, y uno o más dígitos.

imagen de formato de número JSON

 59
Author: Delan Azabani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-24 00:52:33

Es perfectamente válido, de acuerdo a RFC 4627 RFC 7159*:

La representación de los números es similar a la utilizada en la mayoría de lenguajes de programación. Un número contiene un componente entero que puede ser prefijado con un signo menos opcional, que puede ser seguido por una parte fracción y / o una parte exponente.

Las formas octales y hexadecimales no están permitidas. No se permiten ceros a la izquierda.

Una fracción es un decimal punto seguido de uno o más dígitos.

Una parte exponente comienza con la letra E en mayúscula o minúscula, que puede ser seguido por un signo más o menos. La E y opcional signo son seguidos por uno o más dígitos.

Valores numéricos que no se pueden representar como secuencias de dígitos (como Infinity y NaN) no están permitidos.

A los exponentes se les permite tener 0s iniciales, pero no la sección entera:

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

* El estándar RFC 7159 reemplaza el memo informativo RFC 4627, sin embargo, la gramática utilizada sigue siendo exactamente la misma.

 11
Author: Qantas 94 Heavy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-29 10:23:02

Mientras que desde una perspectiva JSON (y JavaScript) estos cuatro números

A) 100
b) 100.0
c) 1.0E+2
d) 1E+2

Son solo cuatro formas de escribir exactamente el mismo número, en entornos donde los enteros y los reales son tipos distintos de números que podrían no ser todos equivalentes.

Y mientras que (a) claramente significa un entero, y (b) un real, y (c) un real también, el caso (d) es un poco ambiguo: por ejemplo, en C esto es un punto flotante literal (porque hay un exponente), pero en Ada es un literal entero (porque no hay punto decimal).

Y en ISO 6093:1985 "Procesamiento de la información – Representación de valores numéricos en cadenas de caracteres para el intercambio de información", el último es no válido, mientras que los otros tres corresponden a los tres formatos distinguibles NR1, NR2 y NR3 definidos allí.

Así que en general-en JSON o en otro lugar -, preferiría y recomiendo siempre incluya un punto decimal en una representación de cadena decimal" científica " con un exponente.

Y colocar al menos un dígito delante del punto decimal (si hay uno), como JSON (y Ada, pero no C) requiere e ISO 6093 recomienda (pero no requiere).

Solo para evitar malentendidos (entre humanos) o problemas de intercambio de datos (entre máquinas y programas).

 8
Author: mrtnhfmnn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-11 05:42:20