62

我想知道以下浮点表示法是否是有效的 JSON 表示法:

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

还是应该用十进制表示法替换指数表示法?

4

3 回答 3

97

根据json.org上可用的格式,它是有效的,因为数字可以有一个以 E、大写或小写字母表示的以 10 为底的指数,可选的加号或减号,以及一个或多个数字。

JSON数字格式的图像

于 2013-10-24T00:52:33.577 回答
21

从 JSON(和 JavaScript)的角度来看,这四个数字

a) 100
b) 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 建议(但不是要求)。

只是为了避免误解(在人类之间)或数据交换麻烦(在机器和程序之间)。

于 2016-12-11T05:42:20.387 回答
15

这是完全有效的,根据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 信息备忘录,但使用的语法保持完全相同。

于 2013-10-24T00:52:41.013 回答