【问题标题】:JSON standard - floating point numbersJSON 标准 - 浮点数
【发布时间】:2013-10-24 00:50:35
【问题描述】:

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

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

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

【问题讨论】:

标签: json floating-point standards exponent


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    从 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 建议(但不要求)在小数点前放置至少一位(如果有的话)。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-11-29
        • 1970-01-01
        • 2019-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多