在 jsonlite 中使用 fromJSON 转换 JSON 时的有效数字
Significant digits when converting JSON using fromJSON in jsonlite
我正在使用 jsonlite
包中的 fromJSON
将 JSON 转换为 R 对象,但数值正在四舍五入。如何控制转换数值的精度?
例子
library(jsonlite)
fromJSON('{"lon": -86.143278324353244}')
## $lon
## [1] -86.14328
## Desired output is -86.143278324353244
查看 jsonlite
代码,我已将函数调用追溯到 R_parse,在 parse.c
.Call(jsonlite:::R_parse, "-86.143278324353244", FALSE)
## [1] -86.14328
其他尝试
fromJSON
有一个 digits
参数,但它不是 toJSON
的有效参数。
- 其他包如
rjson
和 RJSONIO
产生类似的结果。
它在那里...
> print(fromJSON('{"lon": -86.143278324353244}'), digits=20)
$lon
[1] -86.143278324353247
万一有人还在访问这个 - 我碰到了类似的东西,而且很糟糕,这是限制 JSON 只有一个 float 类型,并且 fromJSON
导入是四舍五入的。
在我的例子中,我试图读取一个纳秒级的值,它被增加了 13 纳秒左右。如果你 运行 在 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 字符串之外...
使用设置 options(digits = 30)
解决了我的问题。
我正在使用 jsonlite
包中的 fromJSON
将 JSON 转换为 R 对象,但数值正在四舍五入。如何控制转换数值的精度?
例子
library(jsonlite)
fromJSON('{"lon": -86.143278324353244}')
## $lon
## [1] -86.14328
## Desired output is -86.143278324353244
查看 jsonlite
代码,我已将函数调用追溯到 R_parse,在 parse.c
.Call(jsonlite:::R_parse, "-86.143278324353244", FALSE)
## [1] -86.14328
其他尝试
fromJSON
有一个digits
参数,但它不是toJSON
的有效参数。- 其他包如
rjson
和RJSONIO
产生类似的结果。
它在那里...
> print(fromJSON('{"lon": -86.143278324353244}'), digits=20)
$lon
[1] -86.143278324353247
万一有人还在访问这个 - 我碰到了类似的东西,而且很糟糕,这是限制 JSON 只有一个 float 类型,并且 fromJSON
导入是四舍五入的。
在我的例子中,我试图读取一个纳秒级的值,它被增加了 13 纳秒左右。如果你 运行 在 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 字符串之外...
使用设置 options(digits = 30)
解决了我的问题。