按十进制值递增的R不会返回预期值

时间:2012-09-10 20:28:54

标签: r

我在R中编写一个函数,要求我将计数器递增0.05。当我调整计数器的值时,我会被告知该值不是它出现的值。

示例:

将计数器设为0

  

cntr< - 0; CNTR;

[1] 0

递增计数器0.05并测试

  

cntr< - cntr + 0.05; CNTR;       [1] 0.05

> cntr == 0.05
[1] TRUE

到目前为止,这么好。但经过几次迭代后,会发生以下情况:

> cntr <- cntr + 0.05; cntr;
[1] 0.1
> cntr == 0.1
[1] TRUE
> cntr <- cntr + 0.05; cntr;
[1] 0.15
> cntr == 0.15
[1] FALSE

发生了什么,为什么? cntr返回的值是0.15,但它不等于这个值? 进一步调查显示:

> cntr < 0.1500000000000001
[1] TRUE
> cntr < 0.15000000000000001
[1] FALSE

  

round(cntr,2)== 0.15       [1] TRUE

我误解了什么,或者有什么我没看到的?任何帮助将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:5)

你必须使用isTRUE(all.equal(cntr, x)),其中x是0.1,0.05等。由于浮点舍入错误,您的测试失败。 all.equal测试该错误的平等性。查看R Inferno中的第1圈,了解可能会让您失望的其他示例。

答案 1 :(得分:3)

另一种方法可能是使用整数并增加5。当您需要使用递增的值时,除以100。

您说明的问题是由于在使用二进制格式时计算机程序中存储十进制值的方式;这不是R特有的问题。您可以详细了解here

的原因

答案 2 :(得分:3)

从更广泛的意义上说,你看起来对R编程很新,我想问你为什么要使用计数器。通常,R不鼓励使用循环,尤其是带有计数器的循环。如果您使用带计数器的循环,则可能会对您的函数进行向量化以提高代码的效率。