我遇到了函数 seq
的某种奇怪(或只是没想到?)行为.
创建简单序列时,某些值无法与 == 运算符正确匹配。
请参阅此最小示例:
my.seq <- seq(0, 0.4, len = 5)
table(my.seq) # ok! returns 0 0.1 0.2 0.3 0.4
# 1 1 1 1 1
which(my.seq == 0.2) # ok! returns 3
which(my.seq == 0.3) # !!! returns integer(0)
手动创建我的序列时,它似乎有效,但:
my.seq2 <- c(0.00, 0.10, 0.20, 0.30, 0.40)
which(my.seq2 == 0.3) # ok! returns 4
你对此有什么解释吗?我通过使用
which(round(my.seq, 2) == 0.3)
解决了这个问题但我会对导致问题的原因感兴趣。预先感谢您的意见。
最佳答案
计算机只是不能很好地表示浮点数。电子表格隐藏这一点的普遍趋势,作为大多数人在计算机上处理数字的主要方式,导致了许多问题。
永远不要匹配精确的浮点值。 R 中有一些函数可以处理这个问题(例如 all.equal
),但我更喜欢以下内容。
假设你有一个未知的浮点变量 A,你想看看它是否等于 0.5。
abs(A - 0.5) < tol
将容差设置为您需要的接近程度为 0.5。例如,
tol <- 0.0001
可能对你没问题。如果您的值看起来像它们应该是整数。或者,如果您知道要测试的十进制级别,则可以四舍五入到该十进制级别。
关于r - seq 和 == 运算符的神秘行为。精度问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11742556/