这不是问题。我想介绍R中几乎没有记录的部分。
a <- 0.3-0.1 # should be 0.2
b <- 0.7-0.5 # should also be 0.2
但是,由于浮点表示,
a==b
[1] FALSE
从文档中,有两种正确的方法来布尔检查相等性:
isTRUE(all.equal(a,b))
identical(all.equal(a,b), TRUE)
如果想要在一个>
结构中检查<
,==
,if .. else if .. else if
中的所有内容,那么不能立即明显的是,那么平等的测试必须在其他两个测试之前进行。由于任何一个
由于浮点数字模糊性,a > b
或a < b
可能无法预测为真 - 再次出现。
不受欢迎行为的示例:
if (a < b)
{
print('a smaller than b')
} else if (a > b) {
print('a greater than b')
} else if (isTRUE(all.equal(a,b))) {
print('a equal b')
}
[1] "a smaller than b"
我希望这会有所帮助。
亲切的问候, 卢卡
答案 0 :(得分:4)
如果我运行你的代码,我会
> [1] "a greater than b"
这并不意外。从R inferno的第一个圆圈中获取提示并查看更多数字
> print(c(a,b,a-b), digits=20)
[1] 1.9999999999999998335e-01 1.9999999999999995559e-01
[3] 2.7755575615628913511e-17
因此毫不奇怪R认为a > b
是真的。
为了解决这个问题,你可以编写类似
的内容if (a < b & ! isTRUE(all.equal(a, b))) {
print('a smaller than b')
} else if (a > b & ! isTRUE(all.equal(a, b))) {
print('a greater than b')
} else if (a == b | isTRUE(all.equal(a, b))) {
print('a equals b')
}
答案 1 :(得分:4)
这就是OP的解决方案:
if (isTRUE(all.equal(a, b))) {
print('a equals b')
} else if (a > b) {
print('a greater than b')
} else if (a < b) {
print('a smaller than b')
}
首先排除all.equal
- ity,然后您可以相信<
和>
将执行预期的操作。这样,就不需要重复使用all.equal
。
答案 2 :(得分:1)
或者,您可以包含阈值。
thresh <- 1e-12
if (a - b > thresh) {
print('a greater than b')
} else if (b - a > thresh) {
print('a smaller than b')
} else {
print('a equals b')
}