JSON standard-числа с плавающей запятой
Мне интересно, является ли следующая нотация с плавающей запятой допустимой нотацией JSON:
"result":{"base_fee":1e-005}
или следует заменить нотацию экспоненты десятичной нотацией?
3 ответов
Это допустимо по имеющимся в формате json.org как цифр может иметь основание 10 показатель обозначается е, прописных и строчных, необязательного знака плюс или минус, и одна или более цифр.
это совершенно справедливо, согласно 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 рекомендует (но не требует).
просто чтобы избежать недоразумений (среди людей) или проблем с обменом данными (среди машин и программ).