【问题标题】:Significant digits when converting JSON using fromJSON in jsonlite在 jsonlite 中使用 fromJSON 转换 JSON 时的有效数字
【发布时间】:2016-03-16 14:19:29
【问题描述】:

我正在使用 jsonlite 包中的 fromJSON 将 JSON 转换为 R 对象,但数值正在四舍五入。如何控制转换后的数值的精度?

示例

library(jsonlite)
fromJSON('{"lon": -86.143278324353244}')
## $lon
## [1] -86.14328

## Desired output is -86.143278324353244

查看jsonlite 代码,我在parse.c 中将函数调用追溯到R_parse

.Call(jsonlite:::R_parse, "-86.143278324353244", FALSE)
## [1] -86.14328

其他尝试

  • fromJSON 有一个 digits 参数,但它不是 toJSON 的有效参数。
  • rjsonRJSONIO 等其他软件包会产生类似的结果。

【问题讨论】:

  • 这些值没有在内部四舍五入。 R 默认情况下不会打印所有数字,因为这通常有点不守规矩。

标签: json r jsonlite


【解决方案1】:

它就在那里……

> print(fromJSON('{"lon": -86.143278324353244}'), digits=20)
$lon
[1] -86.143278324353247

【讨论】:

    【解决方案2】:

    万一有人还在访问这个 - 我遇到了类似的事情,而且,这是 JSON 仅具有浮点类型的限制,并且 fromJSON 导入是四舍五入的。 在我的例子中,我试图读取一个纳秒的值,但它被颠簸了 13ns 左右。如果你在 R 中运行:

    suppressMessages(library(jsonlite))
    options(digits=22)
    x=fromJSON('{"ns": 1567002188374607769}')
    print(x)
    print(fromJSON('{"ns": 1567002188374607769}'), digits=22)
    

    我明白了:

    $ns
    [1] 1567002188374607872
    
    $ns
    [1] 1567002188374607872
    

    ...872 != ...769 我还没有想出一个好的解决方案,除了可能将 ns 值存储为 JSON 字符串...

    【讨论】:

      【解决方案3】:

      使用设置options(digits = 30) 解决我的问题。

      【讨论】:

        猜你喜欢
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多