R语言数值减法与比较结果不一致问题求助
关于R语言浮点数减法与比较结果不一致的原因解释
这不是R的bug,而是所有使用二进制浮点数的编程语言都会碰到的通用问题——十进制浮点数的二进制存储精度限制。
计算机中的浮点数(R默认用double类型)是通过二进制编码存储的,但很多十进制小数无法被二进制精确表示,只能以近似值的形式存储。比如你用到的0.1、8.3这类数,转换成二进制后是无限循环的小数,存储时只能截取有限位数,导致底层实际存储的数值和你看到的十进制数存在微小偏差。
结合你的例子具体看:
- 当计算
8.3-0.1时,实际得到的数值并非精确的8.2,只是R在打印或用dput()输出时,会把这个近似值四舍五入显示为8.2,但底层存储的是一个接近8.2但有微小误差的数,所以直接用==比较时会返回FALSE。 8.2-0.1==8.1返回TRUE只是巧合:这两个计算产生的浮点误差刚好抵消,导致它们的存储值完全相等,并非所有类似计算都会有这个结果。- 像
8.2-8.1得到0.0999999999999996,是因为8.2和8.1本身的二进制存储就存在误差,相减后误差直接显现,和精确的0.1自然不相等。
在R中正确比较浮点数是否相等的方式是使用all.equal()函数,它会考虑浮点数的精度误差,比如:
a <- 8.3 - 0.1 all.equal(a, 8.2) # 返回TRUE
内容的提问来源于stack exchange,提问作者Jinjin
相关产品推荐
相关产品推荐

