JSON standard-числа с плавающей запятой

Мне интересно, является ли следующая нотация с плавающей запятой допустимой нотацией JSON:

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

или следует заменить нотацию экспоненты десятичной нотацией?

3 ответов


Это допустимо по имеющимся в формате json.org как цифр может иметь основание 10 показатель обозначается е, прописных и строчных, необязательного знака плюс или минус, и одна или более цифр.

image of JSON number format


это совершенно справедливо, согласно RFC 4627 RFC 7159*:

представление чисел аналогично тому, которое используется в большинстве алгоритмический язык. Число содержит целочисленный компонент, который может иметь префикс с дополнительным знаком минус, за которым может следовать дробная часть и/или экспоненциальной части.

восьмеричная и шестнадцатеричная формы не допускаются. Ведущие нули не допускаются.

дробная часть-это десятичная точка, за которой следует одна или несколько цифр.

экспоненциальная часть начинается с буквы E в верхнем или нижнем регистре, за ним может следовать знак плюс или минус. E и факультативный за знаком следуют одна или несколько цифр.

числовые значения, которые не могут быть представлены в виде последовательности цифр (например, Infinity и NaN) не допускаются.

экспонентам разрешается ведущие 0, но не целочисленный раздел:

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

* стандарт RFC 7159 заменяет информационную памятку RFC 4627, однако используемая грамматика остается точно такой же.


в то время как с точки зрения JSON (и JavaScript) эти четыре цифры

a)100
б) 100.0
c)1.0E+2
d)1E+2

- это всего лишь четыре способа написать одно и то же число, в средах, где целые числа и реалы-это разные типы чисел, которые могут быть не эквивалентны.

и хотя (a) явно означает целое число, и (b) реальное, и (c) реальное, случай (d) немного неоднозначен: например, в C это литерал с плавающей запятой (потому что есть показатель), но в Ada это целочисленный литерал (потому что нет десятичной точки).

и ISO 6093: 1985 "обработка информации – представление числовых значений в строках символов для обмена информацией", последний -недействительным, в то время как остальные три соответствуют трем различимым форматам NR1, NR2 и nr3, определенным там.

так, в вообще-в JSON или в другом месте-я бы предпочел и рекомендовал всегда включать десятичную точку в" научное " десятичное строковое представление с показателем.

и поместить хотя бы одну цифру перед десятичной запятой (если она есть), как требует JSON (и Ada, но не C) и ISO 6093 рекомендует (но не требует).

просто чтобы избежать недоразумений (среди людей) или проблем с обменом данными (среди машин и программ).