北京大学生物信息平台论坛

 找回密码
 立即注册
搜索
热搜: 通知 活动

R中储存数字的精度

[复制链接]
licheng 发表于 2015-12-23 01:36:45 | 显示全部楼层 |阅读模式
2014-12-04 14:50 GMT+08:00 Yu
另外我最近运行R时偶然遇到了一个奇怪的现象,顺便向您请教。如下:

> test<-rbind(c(0.53,0.43),c(0.32,0.22))
> test
     [,1] [,2]
[1,] 0.53 0.43
[2,] 0.32 0.22
> test2<-cbind(test,new=(test[,1]-test[,2]))
> test2
                      new
[1,] 0.53 0.43 0.1
[2,] 0.32 0.22 0.1

> test2[1,3]==0.1
  new
FALSE

> test2[1,3]>0.1
new
TRUE


看起来是数值精度出了问题,这种现象应如何避免? Thanks.



【Cheng】

数都是以二进制储存在计算机里的,所以0.1或0.53没有办法精确表示,但0.25可以。你为什么要判断它是否是0.1?根据需要你可以写成

> abs(test2[1,3]-0.1) < 1e-10
new
TRUE

> sprintf("%.100f", as.numeric(test2[1,3]))
[1]"0.1000000000000000333066907387546962127089500427246093750000000000000000000000000000000000000000000000"
> sprintf("%.100f", 0.1)
[1]"0.1000000000000000055511151231257827021181583404541015625000000000000000000000000000000000000000000000"
> sprintf("%.100f", 0.53)
[1]"0.5300000000000000266453525910037569701671600341796875000000000000000000000000000000000000000000000000"
> sprintf("%.100f", 0.25)
[1]"0.2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"

http://stackoverflow.com/questions/2287616/controlling-digits-in-r



【Yu 】因为按照一定阈值来挑取基因时,比如>=0.1 就会把=0.1的漏掉。

回复

使用道具 举报

nirvana 发表于 2016-1-6 13:10:37 | 显示全部楼层
另一个解决办法是
as.numeric(as.character(test2[1,3]))==0.1
回复 支持 反对

使用道具 举报

北京大学生物信息平台论坛

GMT+8, 2017-9-23 04:39 , Processed in 0.084862 second(s), 22 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表