Подтвердить что ты не робот

Стандарт JSON - номера с плавающей запятой

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

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

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

4b9b3361

Ответ 1

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

image of JSON number format

Ответ 2

Это совершенно верно, согласно RFC 4627 RFC 7159 *:

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

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

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

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

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

Экспонентам разрешено иметь ведущие 0s, но не целые секции:

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, однако используемая грамматика остается точно такой же.

Ответ 3

В то время как с точки зрения 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 рекомендует (но не требует).

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