先看这样的例子:
- space1 <- seq(89.94, 89.98, by=0.01)
- space2 <- seq(89.96 - 0.02, 89.96 + 0.02, by=0.01)
- AA <- c(89.94, 89.95,89.96,89.97,89.98)
- space1 == AA
- space2 == AA
复制代码
然后会发现,问题简化之后,变成:
89.96+0.02==89.98
为什么结果是FALSE
看一下两种形式在R里存储的情况:
- sprintf("%.54f",89.96+0.02)
- [1] "89.979999999999989768184605054557323455810546875000000000"
- sprintf("%.54f",89.98)
- [1] "89.980000000000003979039320256561040878295898437500000000"
复制代码
然后,会发现其实计算机在计算小数时,跟我们的直觉是不同的,应该是在计算 89.96+0.02,89.96被转化成另一种形式的数据,0.02也是,在计算后,再转化成十进制的数,变成89.98,当然这个89.98是一个约数。
而直接对89.98进行转化,得到的结果并不一定与89.96+0.02计算的结果完全一致,但精度是得到保证的。
在判断时,用all.equal会好一些。
- all.equal(89.96+0.02,89.98)
复制代码
这个得到的结果是TRUE。