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

mid*_*son 3 r

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

例:

将计数器设置为0

cntr < - 0; CNTR;

[1] 0
Run Code Online (Sandbox Code Playgroud)

递增计数器0.05并测试

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

> cntr == 0.05
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但经过几次迭代后,会发生以下情况:

> 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
Run Code Online (Sandbox Code Playgroud)

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

> cntr < 0.1500000000000001
[1] TRUE
> cntr < 0.15000000000000001
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*rde 5

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

  • @SachaEpskamp:`all.equal`在不是'TRUE`时返回一条消息. (2认同)