【问题标题】:R incrementing by decimal value does not return expected valueR按十进制值递增不返回预期值
【发布时间】:2012-09-11 04:48:42
【问题描述】:

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

例子:

将计数器设置为 0

cntr

[1] 0

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

cntr

> 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] 是的

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

【问题讨论】:

标签: r


【解决方案1】:

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

【讨论】:

  • 为什么需要isTRUEall.equal(cntr, x)一个人不会给你TRUEFALSE吗?
  • @SachaEpskamp: all.equal 在不是TRUE 时返回一条消息。
  • 啊,是的,我现在在帮助页面中看到了它,这就是为什么它对我没有用 :D
  • 感谢您的链接。我之前在除法和乘法中看到过浮点问题,这是我第一次看到加法。
【解决方案2】:

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

【讨论】:

  • 是的,我对 R 很陌生。我有一个数据集,需要在 bin 中进行分析。数据中有一个字段取值 0, 0.05, 0.1, 0.15, ..., 1 。我试图做的是使用子集命令返回该字段等于我的 cntr 的集合。我开始尝试这样的事情: range }通过各种方法变成:cntr = 0 for(i in 1:21){ newset
  • 如果已经分箱,请查看by函数进行分组处理。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2018-12-05
    • 2019-11-03
    • 1970-01-01
    • 2013-03-22
    • 2012-02-04
    相关资源
    最近更新 更多