【问题标题】:readr and write_csv: double precision numbers and grisu3readr 和 write_csv:双精度数字和 grisu3
【发布时间】:2018-06-21 20:32:11
【问题描述】:

有时,当我使用 readr(tidyverse 的一部分)中的 write_csv 将一列双精度数字保存到 csv 时,会发生以下情况:像 285121.15 这样的双精度数被写为 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, ...)
   }

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

【问题讨论】:

    标签: r precision readr


    【解决方案1】:

    我的建议是使用以下代码:

    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 2015-08-01
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多