对整数进行反直观测试:63 =(45 x 1.4)= 62

时间:2018-04-03 18:06:44

标签: r

我写了一个(可能不是特别好!)函数来测试一个数字是否是整数:

is.wholeNumber <- function(x) x == floor(x)

一般来说,这个功能对我的目的很有效,因为我真的只考虑我用一些判断位置测试数字的情况,所以我天真的理解是机器精度不应该是一个因素。

当我在45 x 1.4 = 63的情况下应用此功能时,我得到了

> is.wholeNumber( 45 * 1.4)
[1] FALSE

这似乎是因为R的楼层功能没有像我期望的那样进行评估:

> floor(45 * 1.4)
[1] 62

实际上应该是63.

在做一些阅读时,我遇到了this热门帖子,关于如何在R中对此进行编码。最高投票答案提示函数

is.wholeNumber <- function(x) ( x %% 1 ) == 0

这似乎在我的上下文中不起作用,因为我得到了

> (45 * 1.4 ) %% 1
[1] 1

第二个最受欢迎的帖子建议使用

is.wholeNumber <- function(x) all.equal(x, as.integer(x))

并且虽然这不起作用,但确实给出了

的明显意外输出
> is.wholeNumber( 45 * 1.4)
[1] "Mean relative difference: 0.01587302"

我现在已经在干净的R工作室工作区和R终端(R 3.4.2 Short Summer)中尝试了这个并重复了这个问题。我有兴趣知道:

  1. 人们可以在他们的机器上重现这个问题吗?
  2. 为什么我得到这个反直觉的结果?
  3. 解决这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

以下功能将为您提供正确的结果:

is.wholeNumber <- function(x, tol = .Machine$double.eps^0.5)  abs(x - round(x)) < tol