R语言all.equal函数对相同绝对差的两组比较输出不同结果的疑问
为什么all.equal在绝对差值相同的情况下返回不同结果?
你遇到的问题核心是浮点数的二进制存储精度限制——十进制小数在计算机中无法被精确表示,导致看似相等的差值实际存在微小偏差:
- 0.7与0.6的差值,实际计算结果是
0.09999999999999987(略小于0.1),落在tolerance=0.1的容忍范围内,所以all.equal返回TRUE。 - 0.7与0.8的差值,实际计算结果是
0.10000000000000009(略大于0.1),超出了容忍阈值,因此返回差异提示。
验证代码
# 查看浮点数值的精确表示 sprintf("%.20f", 0.7 - 0.6) # 输出:0.09999999999999987000 sprintf("%.20f", 0.8 - 0.7) # 输出:0.10000000000000009000 # 单独测试两组比较 all.equal(0.7, 0.6, tolerance = 0.1, scale = 1) # TRUE all.equal(0.7, 0.8, tolerance = 0.1, scale = 1) # "Mean absolute difference: 0.1"
解决方案
如果需要严格基于绝对差值判断,可以直接使用数值比较替代all.equal:
map2(c(1,1,0.7), c(1,1,0.8), ~abs(.x - .y) <= 0.1) # 结果会返回[[1]] TRUE, [[2]] TRUE, [[3]] TRUE
或者微调tolerance为一个略大于0.1的值(比如0.1000000001),也能让两组比较都返回TRUE。
内容的提问来源于stack exchange,提问作者schd
相关产品推荐
相关产品推荐

