3

我正在用 R 编写一个函数,要求我将计数器增加 0.05。当我以计数器的值为条件时,我被告知该值不是它所显示的值。

例子:

将计数器设置为 0

cntr <- 0; 中心;

[1] 0

将计数器递增 0.05 并进行测试

cntr <- cntr + 0.05; 中心; [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

圆形(cntr,2)== 0.15 [1] 真

是我误解了什么,还是有什么我没有看到?任何帮助将不胜感激。谢谢你。

4

3 回答 3

5

您必须使用isTRUE(all.equal(cntr, x)),其中 x 是 0.1、0.05 等。由于浮点舍入错误,您的测试失败。all.equal测试直到该错误的相等性。查看R Inferno中的 Circle 1 以了解其他可能会绊倒您的示例。

于 2012-09-10T20:32:59.460 回答
3

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

您说明的问题是由于使用二进制格式时十进制值如何存储在计算机程序中;这不是特定于 的问题R您可以在此处阅读有关其原因的更多信息

于 2012-09-10T20:33:40.227 回答
3

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

于 2012-09-10T20:34:34.983 回答