看板 R_Language 關於我們 聯絡資訊
[問題類型]: [軟體熟悉度]: 開發者(有撰寫R 的套件經驗) [問題敘述]: 這個問題很奇怪,我是在使用sample函數時發現的。 簡單來說是R在numeric以及integer的轉換上面似乎不是這麼簡單。 我把問題簡單呈現如下面的程式碼,而這個bug似乎不常出現(但也非罕見),有時候會出錯有時候又不會 [程式範例]: > (1-0.9)*100 [1] 10 > as.integer((1-0.9)*100) [1] 9 > as.integer((1-0.8)*100) [1] 19 > as.integer((1-0.7)*100) [1] 30 [環境敘述]: R 3.2.2 [關鍵字]: 四則運算; 運算; 整數; 數值 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.109.40.5 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1448509036.A.FDB.html
celestialgod: rounding error 11/26 11:39
celestialgod: sprintf("%.15f", (1-0.9)*100) 11/26 11:40
celestialgod: [1] "9.999999999999998" 11/26 11:41
ching0629: 謝謝,所以我可以了解一下到底R裡面再算(1-0.9)實際上是 11/26 11:42
ching0629: 如何做的?不然我沒有辦法預防這個bug 11/26 11:42
celestialgod: as.integer是truncated 11/26 11:44
celestialgod: 用round應該會比較好 11/26 11:44
ching0629: 舉個例子來說,sprintf("%.200f", (1-0.60)*100)還是能 11/26 11:44
ching0629: 整除的樣子 11/26 11:44
celestialgod: 0.6在二進位可能是可以完整表示的吧 11/26 11:45
ching0629: 謝謝,那我以後在as.integer內都加上round 11/26 11:45
celestialgod: 恩,晚點看看wush大大有沒有更好的建議XDD 11/26 11:46
ching0629: 那我要提醒大家特別注意了,因為sample函數內有as.inte 11/26 11:47
ching0629: ger,所以抽樣前要很確定你放進去的參數是整數 11/26 11:47
celestialgod: sample的size本來就只能放integer 會有as.integer 11/26 11:52
celestialgod: 不意外xd 11/26 11:52
ching0629: 是不會太意外,但這個bug很少出現,測試的時候可能會沒 11/26 11:52
ching0629: 意,但實際執行的時候才會出現bug導致程序崩潰 11/26 11:53
celestialgod: 恩 是阿QQ as.integer是truncate,也是今天才知道 11/26 11:53
celestialgod: 這應該不能說是bug拉QQ 11/26 12:02
andrew43: 很可能有用,雖然應該都還沒碰到。 11/27 03:43