2.5 比较浮点数

2.5.1 问题

浮点数比较结果通常未能如你所想。比如:

  1. 0.3 == 3 * 0.1
  2. #> [1] FALSE
  3. (0.1 + 0.1 + 0.1) - 0.3
  4. #> [1] 5.551e-17
  5. x <- seq(0, 1, by = 0.1)
  6. x
  7. #> [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
  8. 10 * x - round(10 * x)
  9. #> [1] 0.000e+00 0.000e+00 0.000e+00 4.441e-16 0.000e+00
  10. #> [6] 0.000e+00 8.882e-16 8.882e-16 0.000e+00 0.000e+00
  11. #> [11] 0.000e+00

2.5.2 方案

不存在通用的解决方案,因为这个问题通常是由于非整数(浮点数)在计算机和 R 中的存储方式所导致的。可以通过网址 http://www.mathworks.com/support/tech-notes/1100/1108.html 查阅更多信息。虽然里面使用 Matlab 代码写的,但是基本与 R 一致。