2012-09-10 107 views
3

我在R中寫了一個函數,它要求我將計數器增加0.05。當我對櫃檯的價值進行調整時,我被告知價值不是它的表現。用十進制值遞增的R不返回期望值

實施例:

設置計數爲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 

輪(CNTR,2)== 0.15 [1] TRUE

我誤解的東西,或者是有什麼我我沒有看到?任何幫助將不勝感激。謝謝。

+0

這是[FAQ 7.31](http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f)。 –

回答

5

您必須使用isTRUE(all.equal(cntr, x)),其中x爲0.1,0.05等。由於浮點舍入錯誤,您的測試失敗。 all.equal測試相同的錯誤。查看R Inferno中的圈1,瞭解其中可能會引發你的其他示例。

+1

爲什麼你需要'isTRUE'? 'all.equal(cntr,x)'不會給你'TRUE'或'FALSE'嗎? –

+2

@SachaEpskamp:'all.equal'不是'TRUE'時會返回一條消息。 –

+0

啊,是的,我現在在幫助頁面看到它,這就是爲什麼它從來沒有爲我工作:D –

3

對此的另一種方法可能是使用一個整數並增加5。當您需要使用遞增的值時,除以100.

您說明的問題是由於在使用二進制格式時十進制值如何存儲在計算機程序中;它不是特定於R的問題。您可以閱讀更多關於此原因的更多信息here

3

從更廣泛的意義上說,您看起來對於R編程非常新穎,並且我想問您爲什麼要嘗試使用計數器。一般來說,R不鼓勵使用循環,尤其是循環與計數器。如果您正在使用帶有計數器的循環,則可能需要對函數進行矢量化以提高代碼的效率。

+0

是的,我對R相當陌生。我有一個數據集,需要在箱中分析。數據中有一個字段的值爲0,0.05,0.1,0.15,...,1。我想要做的是使用子集命令返回該字段等於我的cntr的集合。 我開始通過嘗試是這樣的: 範圍< - 爲(i的範圍){ newset } ,其通過各種方法轉變成: CNTR = 0 爲(I在1:21){ newset < - 子集(originalset,場== CNTR) CNTR < - CNTR + 0.05 ... } – DataDog

+0

如果它已經裝箱,請檢查'by'函數進行分組處理。 – TARehman

+0

會做,謝謝! – DataDog