作者ching0629 (Syameroke)
看板R_Language
标题[问题] R里面实际数值与四则运算法?
时间Thu Nov 26 11:37:13 2015
[问题类型]:
[软体熟悉度]:
开发者(有撰写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://webptt.com/cn.aspx?n=bbs/R_Language/M.1448509036.A.FDB.html
1F:→ celestialgod: rounding error 11/26 11:39
2F:→ celestialgod: sprintf("%.15f", (1-0.9)*100) 11/26 11:40
3F:→ celestialgod: [1] "9.999999999999998" 11/26 11:41
4F:→ ching0629: 谢谢,所以我可以了解一下到底R里面再算(1-0.9)实际上是 11/26 11:42
5F:→ ching0629: 如何做的?不然我没有办法预防这个bug 11/26 11:42
6F:→ celestialgod: as.integer是truncated 11/26 11:44
7F:→ celestialgod: 用round应该会比较好 11/26 11:44
8F:→ ching0629: 举个例子来说,sprintf("%.200f", (1-0.60)*100)还是能 11/26 11:44
9F:→ ching0629: 整除的样子 11/26 11:44
10F:→ celestialgod: 0.6在二进位可能是可以完整表示的吧 11/26 11:45
11F:→ ching0629: 谢谢,那我以後在as.integer内都加上round 11/26 11:45
12F:→ celestialgod: 恩,晚点看看wush大大有没有更好的建议XDD 11/26 11:46
13F:→ ching0629: 那我要提醒大家特别注意了,因为sample函数内有as.inte 11/26 11:47
14F:→ ching0629: ger,所以抽样前要很确定你放进去的参数是整数 11/26 11:47
15F:→ celestialgod: sample的size本来就只能放integer 会有as.integer 11/26 11:52
16F:→ celestialgod: 不意外xd 11/26 11:52
17F:→ ching0629: 是不会太意外,但这个bug很少出现,测试的时候可能会没 11/26 11:52
18F:→ ching0629: 意,但实际执行的时候才会出现bug导致程序崩溃 11/26 11:53
19F:→ celestialgod: 恩 是阿QQ as.integer是truncate,也是今天才知道 11/26 11:53
20F:→ celestialgod: 这应该不能说是bug拉QQ 11/26 12:02
21F:推 andrew43: 很可能有用,虽然应该都还没碰到。 11/27 03:43