readr和write_csv:双精度数字和grisu3

时间:2018-06-21 20:32:12

标签: r precision readr

有时候,当我使用来自readr(tidyverse的一部分)的write_csv将一列双精度数字保存到csv时,会发生以下情况:像285121.15这样的double会写为285121.14999999997。原始值只有两个小数,这不是在屏幕上打印出来的假象。从数字上讲,它们几乎是同一回事,但是共享这么多文件(不必要的小数)很烦人。 write_csv的文档说使用了grisu3算法。 同时,我想避免自己舍入这些值,因为通常小数位数可能会有所不同。 根据我在这里找到的东西

http://www.serpentine.com/blog/2011/06/29/here-be-dragons-advances-in-problems-you-didnt-even-know-you-had/

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, ...)
   }

即在保存文件之前,我实际上将数字转换为字符串。 我进行了一些测试,在我看来我的问题已解决,但是我应该注意一些警告吗? 非常感谢!

1 个答案:

答案 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