有时候,当我使用来自readr(tidyverse的一部分)的write_csv将一列双精度数字保存到csv时,会发生以下情况:像285121.15这样的double会写为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, ...)
}
即在保存文件之前,我实际上将数字转换为字符串。 我进行了一些测试,在我看来我的问题已解决,但是我应该注意一些警告吗? 非常感谢!
答案 0 :(得分:0)
我的建议是使用以下代码:
#removing unlike precision (double precision)
A <- floor(A*100)
#then converting to the real number
A <- A/100
R区域中的一个简单示例;)
A <-9.12234353423242
A<-A*100
A
#[1] 912.2344
A<- floor(A)
A
#[1] 912
A <- A/100
A
#[1] 9.12