作者andrew43 (apan)
看板Statistics
标题Re: [程式] R: TRUE FALE 的问题
时间Wed Mar 5 04:11:18 2014
※ 引述《ee012345 (死小孩)》之铭言:
: [软体程式类别]:
: R
: [问题叙述]:
: 昨天发现一件奇怪的事情,例如:
: k=seq(0.1,0.2,0.05);
: k==0.15
: 照理说,output应该是要
: FALSE TRUE FALSE
: 但是跑出来的output却是
: FALSE FALSE FALSE
: 造成我不小的困扰QQ
: [软体熟悉度]:
: 中(3个月到1年)
应该是浮点数的精确度问题。
你可以看到,
> sprintf("%10.30f", 0.15)
[1] "0.149999999999999994448884876874"
但
> sprintf("%10.30f", k[2])
[1] "0.150000000000000022204460492503"
可见二者的差距可能超过 R 的精确度辨别容忍度,所以 0.15==k[2] 为 F。
问题的主要原因是因为你用 seq(0.1,0.2,0.05) 後产生的 0.15 和直接输入的 0.15
的差距太大了。
如果你换成
> k==seq(0.1, 0.2, 0.05)[2]
[1] FALSE TRUE FALSE
就没问题了。
另一个解法就是绕过浮点数,用字串来辨别。
我对 R 预设的浮点数处理不是非常了解,
但你可以看一下
http://rwiki.sciviews.org/doku.php?id=misc:r_accuracy:decimal_numbers
可能会有更多帮助。
--
http://apansharing.blogspot.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.117.37.172
1F:推 memphis:round(k,2)==0.15 这样如何? 03/05 20:24
2F:推 ee012345:谢谢你~ 03/05 20:26
※ celestialgod:转录至看板 R_Language 03/02 16:55