2011-07-29 121 views
4

可能重複:
Why are these numbers not equal?R中的浮點問題?

的以下表達式,計算結果爲0.1,被認爲是大於0.1。

> round(1740/600,0) - 1740/600 
[1] 0.1 
> (round(1740/600,0) - 1740/600) <= 0.1 
[1] FALSE //???!!??? 
> (round(1740/600,0) - 1740/600) <= 0.1000000000000000000000000000000000000001 
[1] TRUE 

思考這個問題可能是由於四捨五入的原因我想這同樣的結果:

> 3 - 2.9 
[1] 0.1 
> (3 - 2.9) <=0.1 
[1] FALSE 

那麼,是什麼給和我怎麼解決它沒有捏造截止?

+7

閱讀本FAQ:http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are- equal_003f –

+0

[R Inferno](http://www.burns-stat.com/pages/Tutor/R_inferno.pdf)也是一個很好的閱讀。 – Aaron

回答

10

Floating-Point Guide

爲什麼我的數字,像0.1 + 0.2加起來一個漂亮的圓0.3, 而是我得到一個怪異的結果像0.30000000000000004?

由於內部計算機使用格式(二進制浮點數) ,因此無法準確表示數字,如0.1,0.2或0.3。

當代碼被編譯或解釋時,您的「0.1」已經被 舍入到該格式的最接近的數字,即使在計算髮生之前,這也會導致一個小的舍入誤差。

我該怎麼做才能避免這個問題?

這取決於你在做什麼樣的計算。

  • 如果你真的需要你的結果加起來,特別是當你使用金錢工作時:使用特殊的十進制數據類型。
  • 如果您只是 不想看到所有這些額外的小數位數:只需在顯示時將您的 結果格式化爲固定的小數位數。
  • 如果您沒有可用的小數數據類型,則可以使用帶整數的 (例如,完全以美分計算金錢。但這 是更多的工作,並有一些缺點。
+0

所以如果我需要做精確的比較,我應該將小數點移到右邊並截斷,以便比較整數? – dnagirl

+0

@dnagirl:或者使用epsilon值進行比較(詳見鏈接)。但無論如何,當你處理不精確的數據時,放棄「精確比較」的想法。真正的問題是你的數據來自哪裏 - 如果你的輸入已經是近似的,那麼擔心這樣的人爲角落案例是毫無意義的。 –

+0

在這種情況下,我試圖通過測量的時間接近一組週期性事件來對時間軌跡數據進行分組。我的數據每秒測量一次。事件每隔10分鐘發生一次。我想在每場比賽的任何一方得到60秒。 – dnagirl

12

存在R功能,可以自動採取明智的做法「平等問題」:

> (3 - 2.9) <=0.1 
#[1] FALSE 

> all.equal((3 - 2.9) , 0.1) 
#[1] TRUE 

它使用的r最小的正浮點數作爲其默認的閾值的平方根,因此處理乘法和除法傳播錯誤。結束大約1e-08