我写了一个(可能不是特别好!)函数来测试一个数字是否是整数:
is.wholeNumber <- function(x) x == floor(x)
Run Code Online (Sandbox Code Playgroud)
一般来说,这个功能对我的目的来说很好,因为我真的只考虑我用一些判断位置测试数字的情况,所以我天真的理解是机器精度不应该是一个因素.
当我在45 x 1.4 = 63的情况下应用此功能时,我得到了
> is.wholeNumber( 45 * 1.4)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
这似乎是因为R的楼层功能没有像我期望的那样进行评估:
> floor(45 * 1.4)
[1] 62
Run Code Online (Sandbox Code Playgroud)
实际上应该是63.
在做一些阅读时,我遇到了这篇关于如何在R中编码的流行帖子.最高投票的答案提示了这个功能
is.wholeNumber <- function(x) ( x %% 1 ) == 0
Run Code Online (Sandbox Code Playgroud)
因为我得到了,这似乎在我的背景下似乎不起作用
> (45 * 1.4 ) %% 1
[1] 1
Run Code Online (Sandbox Code Playgroud)
第二个最受欢迎的帖子建议使用
is.wholeNumber <- function(x) all.equal(x, as.integer(x))
Run Code Online (Sandbox Code Playgroud)
虽然这不再起作用,但确实给出了意想不到的明显输出
> is.wholeNumber( 45 * 1.4)
[1] "Mean relative difference: 0.01587302"
Run Code Online (Sandbox Code Playgroud)
我现在已经在干净的R工作室工作区和R终端(R 3.4.2 Short Summer)中尝试了这个并重复了这个问题.我有兴趣知道:
小智 1
以下函数将为您提供正确的结果:
is.wholeNumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol
Run Code Online (Sandbox Code Playgroud)