【问题标题】:R unexpected rounding by writing in .csv and in a databaseR 通过写入 .csv 和数据库进行意外舍入
【发布时间】:2013-08-21 13:29:15
【问题描述】:

我遇到以下问题。我有大约 10-20 位小数的数值。我将这些值写入 .csv(通过 write.csv2())和数据库(通过 RODBC 包中的 SQLSave())。所有小数对我来说都是相关的。 不幸的是,R 将小数点后 8 位的数字四舍五入。

举个例子:

5655698.697843645699322

变成:

5655698,69784365

我尝试增加位数(options() 中的$digits)但这只会影响我在控制台中看到的位数。 我试过format(,digits=x),这很有效。但是,由于我有大量列,这非常昂贵,而且看起来不是一个干净的解决方案。

还有其他方法可以通过写入 .csv 和数据库来增加位数吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    R 使用 64 位 IEEE 双精度作为其基本数字格式。这有 14-15 个有效数字(不是小数位)的精度限制。所以 R 只是将数字写出到其准确度的正确极限。

    如果你想要更多的小数,你可以使用任意精度算术的包:

    http://cran.r-project.org/web/packages/Rmpfr/index.html

    http://cran.r-project.org/web/packages/gmp/index.html

    【讨论】:

    • 谢谢。你能提供一个关于我如何使用它的例子吗?我尝试了以下方法来提高精度:mpfr(c, precBits = 113)。但在这种情况下,它也会创建不存在的小数。事实上,我得到了以下号码:5655698.69784364569932222366333007812。
    • 这可能是因为当您读入数据时,R 默默地丢弃了多余的精度。您需要使用 gmp 和/或 Rmpfr 提供的任何工具导入数据。
    【解决方案2】:

    你可以试试这个(但这仅适用于 txt 文件而不是 csv 文件)?

     x<-5655698.697843645699322
     y<-sprintf("%.15f",x)
    [1] "5655698.697843645699322"
    
     write(y,"x.txt")
    

    更新:

    y<-format(round(x, 15), nsmall = 15)
    write(y,"x.txt")
    
     y<-format(round(x, 25), nsmall = 25)
    Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L,  : 
      invalid 'nsmall' argument
    

    错误意味着您不能将小数增加超过 15(根据参数 nsmall

     y<-format(round(x, 25), nsmall = 15)
    > y
    [1] "5655698.697843645699322"
    

    【讨论】:

    • 您好,感谢您的提示,但这似乎有一个奇怪的行为。我运行了以下命令:x
    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多