【问题标题】:Converting character to numeric without losing information在不丢失信息的情况下将字符转换为数字
【发布时间】:2014-12-11 20:52:46
【问题描述】:

我想将下面的字符数据转换为数字数据。但是 as.numeric 正在修剪一些信息。如何确保转换为数字后得到 1.00000000000000000000000000000001?

> a="1.00000000000000000000000000000001"
> as.numeric(a)
[1] 1
> as.numeric(a,10)
[1] 1
> as.numeric(as.character(a))
[1] 1
> as.double(a)
[1] 1

【问题讨论】:

  • 这是关于 SO 的最常见问题之一。首先,您需要了解存储值和显示精度之间的差异(在R 中可以使用options 之类的东西进行调整)。其次,您需要了解机器精度以及浮点数如何存储在二进制数字计算机中。比如a="1.00000000000001" sprintf('%1.20f',as.numeric(a)) [1] "1.00000000000000999201" 第三,检查浮点值的精度限制。

标签: r character numeric


【解决方案1】:

如果你需要这么高的精度,可以考虑 Rmpfr

library(Rmpfr)
longa<-mpfr("1.00000000000000000000000000000001",200)
longa
1 'mpfr' number of precision  200   bits 
[1] 1.0000000000000000000000000000000100000000000000000000000000004

请注意,即使在这里也有一点 4x10-[bignumber] 错误。

尝试更棒的东西:

mpfr("1.00000000000000000000000000000001e50",200)
1 'mpfr' number of precision  200   bits 
[1] 100000000000000000000000000000001000000000000000000 #is an integer, so no error
mpfr("1.00000000000000000000000000000001e50",200)/1e50
1 'mpfr' number of precision  200   bits 
[1] 0.99999999999999992370230158908114578838913309406505827306768701

我要指出的是,在计算机上处​​理浮点数时需要非常小心。

【讨论】:

    【解决方案2】:

    as.character 不是问题,而是数值精度的限制:

    > a <- 1.00000000000000000000000000000001
    > a == 1
    [1] TRUE
    

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 2012-04-14
      • 2015-01-10
      • 2018-02-09
      相关资源
      最近更新 更多