【发布时间】:2018-06-21 20:32:11
【问题描述】:
有时,当我使用 readr(tidyverse 的一部分)中的 write_csv 将一列双精度数字保存到 csv 时,会发生以下情况:像 285121.15 这样的双精度数被写为 285121.14999999997。原始值只有两位小数,这不是在屏幕上打印的人工制品。从数值上看,它们几乎是一回事,但是与这么多(不需要的小数)共享文件很烦人。 write_csv 的文档说使用了 grisu3 算法。 同时,我想避免自己四舍五入,因为通常小数位数可能会有所不同。 根据我在这里找到的
florian.loitsch.com/publications/dtoa-pldi2010.pdf?attredirects=0
这是 grisu3 的一个已知缺点。 看到我现在正在处理大型数据集(因此写入磁盘不是一个大问题),我想出了以下内容
############ to avoid troubles when saving numbers
num_to_char <- function(df){
res <- df %>% mutate_if(is.numeric, as.character )
return(res)
}
to_csv <- function(df, ...){
df <- num_to_char(df)
write_csv(df, ...)
}
即在保存文件之前,我基本上将数字转换为字符串。 我进行了一些测试,在我看来我的问题已经解决了,但是有什么我应该注意的警告吗? 非常感谢!
【问题讨论】: