比较双打时奇怪的seq()行为

时间:2018-09-04 13:27:41

标签: r

如果我定义:

z <- seq(0, 1, by = 0.1)

按预期,我得到了这个数字向量:

> z
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

现在,说我想在z中搜索特定值。让我们尝试从0.00.5的所有值:

> which(z == 0.0)
[1] 1
> which(z == 0.1)
[1] 2
> which(z == 0.2)
[1] 3
> which(z == 0.3)
integer(0)
> which(z == 0.4)
[1] 5
> which(z == 0.5)
[1] 6

看到那里的问题了吗?当应该返回which(z == 0.3)时,integer(0)返回4

如果进一步扩展此序列,则0.61.2也会发生相同的情况,而0.91.5不会发生同样的情况。因此,看来0.3偶数倍受此行为影响。

可以通过将z舍入到最低有效可见位来进行快速修复:

z <- round(z, 1)

然后,将产生预期的结果:

> which(z == 0.0)
[1] 1
> which(z == 0.1)
[1] 2
> which(z == 0.2)
[1] 3
> which(z == 0.3)
[1] 4
> which(z == 0.4)
[1] 5
> which(z == 0.5)
[1] 6

我已经在多个OS和R版本中对此进行了测试,所有这些都给出了相同的结果:

  • Mac OSX 10.13.6,Linux Ubuntu 16.04.4 LTS和Amazon Linux AMI 2.0(2017.12)
  • R 3.4.0、3.4.3、3.4.4、3.5.0和3.5.1

我想知道seq()是否真的像这样工作,或者确实是一个错误?

0 个答案:

没有答案