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

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

在阅读时,我遇到了有关如何在R中进行编码的this热门文章。投票最高的答案表明该功能
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 studio工作区中以及从R终端(R 3.4.2短夏)中尝试了此方法,并重复了此问题。我想知道:
  • 人们可以在其计算机上重现此问题吗?
  • 为什么我得到此反常的直观结果?
  • 解决此问题的正确方法是什么?
  • 最佳答案

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

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

    关于r - 针对整数进行反直观测试: 63 = (45 x 1. 4)= 62,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49636555/

    10-13 03:20