R 大数值型数据转换

科学计数转换

R 默认对超过一定位数的数值采用科学计数法表示,但有时候直查看数据还是直接展示更加直观。

> format(1.11011E+16, scientific = FALSE, digits = 0)
[1] "11101100000000000"

也可以通过设置options参数更改系统默认行为

> 12345600000000000000
[1] 1.23456e+19
> options(scipen = 20)
> 12345600000000000000
[1] 12345600000000000000

大数值数据

> options(scipen = 100)  #为了看出差别先把科学计数显示的位数设高些

对于大数值(超过23位的数据)会产生精度问题,无论是直接输入还是用科学计数法都会由于精度问出现误差:

> 100000000000000000000000
[1]  99999999999999991618642
> format(1E+28, scientific = FALSE)
[1] " 9999999999999999583262242462"

以及计算错误:

> a <- 1000000000000000000000000
> b <- a + 1
> a == b 
[1] TRUE

此时可通过使用gmpRmpfr包来解决, 其中gmpRmpfr的依赖包所以只用安装后者即可。需要注意的是
输入数据必须是字符型的,数值型数据在作为参数传入时会被函数的执行环境改变,从而无法完成转换。

> gmp::as.bigz('100000000000000000000000000000000')  # 传入数据得是字符型
Big Integer ('bigz') :
[1] 100000000000000000000000000000000

对比:

> as.numeric('100000000000000000000000000000000')
[1] 100000000000000005378260420040822

当然,此类差别在低精度情况下是不存在的。此外,一些常量也可以通过Rmpfr来获取,比如pi:

> library(Rmpfr)
> Const("pi", prec = 160)
1 'mpfr' number of precision  160   bits 
[1] 3.141592653589793238462643383279502884197169399376e0

> Const("pi", prec = 1024)
1 'mpfr' number of precision  1024   bits 
[1] 3.14159265358979323846264338327950288419716939937510582
097494459230781640628620899862803482534211706798214808651
3282306647093844609550582231725359408128481117450284102701
938521105559644622948954930381964428810975665933446128475
648233786783165271201909145648566923460348610454326648213
393607260249141273724587e0

通过设置比特精度,可以实现任意大值数据的转换,甚至是字符型的科学计数法数据也没问题,有些时候从excel读取的数据会被直接转换成类似’1.23E+30’的字符格式,想要还原数据的本来面目可以采用以下的函数:

> mpfr('100000000000000000000000000', prec = 10) # 低精度时依然存在误差
1 'mpfr' number of precision  10   bits 
[1] 100038611573110564206936064

> mpfr('100000000000000000000000000', prec = 100) # 将精度调高即可解决问题
1 'mpfr' number of precision  100   bits 
[1] 100000000000000000000000000

> mpfr('1e+30', prec = 100)  # 对于科学计数法表示的数据也可以正常转换
1 'mpfr' number of precision  100   bits 
[1] 1000000000000000000000000000000
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值