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