全部版块 我的主页
论坛 提问 悬赏 求职 新闻 读书 功能一区 经管百科 爱问频道
882 8
2017-05-15
复制代码
如上述代码,我们知道a与b的值是相等的,但运行‘a == b’后返回FALSE。说明a与b是不同的两个变量。那么究竟哪里不同呢?用什么函数可以查看这种不同呢?还有我的另外一篇帖子:
https://bbs.pinggu.org/thread-5004830-1-1.html
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2017-5-15 17:10:06
浮点精度问题。这个是基础的编程问题,浮点数之间比较不允许用== 用sprintf打印a和b,就会发现不同了:
> sprintf("%.20f", a)
[1] "30.00000000000000355271"
> sprintf("%.20f", b)
[1] "30.00000000000000000000"

一般来说,浮点数比较只有在一个情况下才允许用==,就是仅用于直接赋值的情况,例如
a <- 25.99999
b <- 25.99999
> g == h
[1] TRUE

其他情况下,要比较浮点数,需要这么做:
> abs(a-b) < 0.0001
[1] TRUE

就是说,允许一定精度内的误差。楼主明白了吧?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-5-16 08:38:52
silver_gp 发表于 2017-5-15 17:10
浮点精度问题。这个是基础的编程问题,浮点数之间比较不允许用== 用sprintf打印a和b,就会发现不同了:
>  ...
谢谢,明白了a与b的不同。
但是照你所说,那是什么原因导致了精度不同呢?类似于你的方法,在查看T*(1 - 0.3) 与T*(1 - 0.7)的精度时,结果如下:
> sprintf("%.30f", T*(1- 0.3))
[1] "70.000000000000000000000000000000"
> sprintf("%.30f", T*(1- 0.7))
[1] "30.000000000000003552713678800501"
而:
> sprintf("%.30f", 0.3)
[1] "0.299999999999999988897769753748"
> sprintf("%.30f", 0.7)
[1] "0.699999999999999955591079014994"
那这是什么原因呢?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-5-16 09:29:47
因为计算机使用二进制保存这些数据,转换为十进制会有误差
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-5-16 09:30:38
因为计算机使用二进制保存这些数据,转换为十进制会有误差
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-5-16 10:33:19
xugami 发表于 2017-5-16 09:29
因为计算机使用二进制保存这些数据,转换为十进制会有误差
使用二进制这我知道,转换为十进制有误差也能理解,但是0.3、0.7有误差,怎么乘100之后有的有误差,有的误差就没有了呢?
> sprintf("%.40f", 100*0.3)
[1] "30.0000000000000000000000000000000000000000"
> sprintf("%.40f", 100*(1-0.7))
[1] "30.0000000000000035527136788005009293556213"
导致这种结果出现的原因是什么?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群