%in%运算符异常:负到正数值序列匹配返回错误结果
解决R中
%in%检测浮点数序列时的精度问题 这是典型的浮点数精度误差导致的问题,和你用的R版本无关。
R里的浮点数采用二进制存储,像0.01、0.07这类十进制小数无法被二进制精确表示。当seq生成较长的序列时,每一步的微小误差会累积,导致序列里的“0.07”实际存储值并不是精确的0.07——你可以用sprintf("%.20f", seq(from=-1.02, to=0.08, by=0.01)[110])查看,会得到类似0.07000000000000012的数值。这时候不管是直接用0.07 %in% seq(...),还是转成字符后匹配,都会因为数值不精确而返回FALSE;而短序列(比如-0.20到0.08)的误差还没累积到足以让数值偏离到字符匹配失败的程度,所以返回TRUE。
给你几个可行的解决办法:
用范围判断替代
%in%:设置一个极小的容差(比如1e-6),判断目标值是否和序列中的某个值足够接近:target <- 0.07 seq_vec <- seq(from = -1.02, to = 0.08, by = 0.01) any(abs(seq_vec - target) < 1e-6) # 返回TRUE用整数生成序列再转换:绕开浮点数累积误差,先生成整数序列,再除以100得到目标小数:
seq_vec <- (-102:8)/100 # 从-102到8的整数,除以100得到对应小数 0.07 %in% seq_vec # 返回TRUE四舍五入后再做字符匹配:如果一定要用字符检测,先对序列值做四舍五入保留两位小数,再转成字符:
seq_char <- as.character(round(seq(from = -1.02, to = 0.08, by = 0.01), 2)) "0.07" %in% seq_char # 返回TRUE
内容的提问来源于stack exchange,提问作者DPEaleo
相关产品推荐
相关产品推荐

