R语言seq序列判断异常:0.2应在序列中但%in%返回FALSE
问题原因:浮点数精度误差
这是典型的浮点数精度问题。你理论上计算的-5 + 5.2 = 0.2没错,但在计算机里,5.2这类十进制小数无法用二进制浮点数精确表示,导致序列生成时第二个元素并不是精确的0.2,而是一个极其接近的近似值。
验证一下:
# 查看序列第二个元素的精确值 print(numbers[2], digits = 20) # 输出:0.19999999999999928946 # 直接和0.2比较 numbers[2] == 0.2 # 输出:FALSE
%in%运算符是做精确匹配,所以会返回FALSE。
解决方案
有两种常用的处理方式:
用整数运算生成序列,避免浮点数误差
将所有数值放大10倍(消除小数),生成整数序列后再缩小10倍:numbers <- seq(-50, 2000, 52)/10 0.2 %in% numbers # 输出:TRUE使用
all.equal()进行近似比较
如果无法修改序列生成方式,可以用all.equal()来判断是否在误差范围内相等:any(sapply(numbers, function(x) all.equal(x, 0.2))) # 输出:TRUE
内容的提问来源于stack exchange,提问作者Nicolas Fauvarque
相关产品推荐
相关产品推荐

