json - que - punto flotante ieee 754 ejemplos
Estándar JSON-números de coma flotante (3)
Me pregunto si la siguiente notación de punto flotante es una notación JSON válida:
"result":{"base_fee":1e-005}
¿O debería reemplazarse la notación exponencial con una notación decimal?
Es perfectamente válido, según RFC 4627 RFC 7159 *:
La representación de números es similar a la utilizada en la mayoría de los 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 de fracción y / o una parte de exponente.
Las formas octales y hexagonales no están permitidas. Los ceros iniciales no están permitidos.
Una parte de la fracción es un punto decimal seguido de uno o más dígitos.
Una parte exponente comienza con la letra E en mayúscula o minúscula, que puede ir seguida de un signo más o menos. La E y el signo opcional son seguidos por uno o más dígitos.
Los valores numéricos que no pueden representarse 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 la nota informativa RFC 4627, sin embargo, la gramática utilizada sigue siendo exactamente la misma.
Es válido de acuerdo con el formato disponible en json.org ya que los números pueden tener opcionalmente un exponente de base 10 denotado por una E, mayúscula o minúscula, un más o menos opcional y uno o más dígitos.
Si bien 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 el mismo número exacto, en entornos donde los enteros y los reales son tipos distintos de números que podrían no ser todos equivalentes.
Y mientras (a) claramente significa un número entero, y (b) un real, y (c) un real también, el caso (d) es un poco ambiguo: por ejemplo, en C este es un literal de coma flotante (porque hay un exponente), pero en Ada es un literal entero (porque no hay un punto decimal).
Y en ISO 6093: 1985 "Procesamiento de información - Representación de valores numéricos en cadenas de caracteres para el intercambio de información", el último no es válido , mientras que los otros tres corresponden a los tres formatos distinguibles NR1, NR2 y NR3 definidos allí.
Entonces, en general, en JSON o en cualquier otro lugar, preferiría y recomendaría incluir siempre un punto decimal en una representación de cadena decimal "científica" con un exponente.
Y para colocar al menos un dígito delante del punto decimal (si hay uno), como lo requiere JSON (y Ada, pero no C) y recomienda ISO 6093 (pero no es obligatorio).
Solo para evitar malentendidos (entre humanos) o problemas de intercambio de datos (entre máquinas y programas).