R语言中对数值使用%in%运算符返回错误结果的原因
问题根因
- R 中默认所有不带类型后缀的数值都会存储为 双精度浮点数(double 类型),双精度浮点数仅提供 53 个二进制位的有效精度,换算为十进制约等于 15~17 位有效数字。
- 你使用的所有数值均为 19 位十进制长度,已经远超出双精度浮点数的精确整数表示范围,输入时就已经发生了精度截断,多个不同的整数值会被映射为同一个双精度浮点数,因此匹配时出现误判。
- 你可以运行以下代码验证精度丢失情况:
# 验证两个不同的大整数是否被识别为同一值 identical(6969277959563657216, 6969277959563657217) # 输出: TRUE
修复方案
如果需要处理超长整数,建议以字符串形式存储数值,或者使用支持任意精度整数的扩展包,比如 bit64 包的 integer64 类型:
library(bit64) # 以字符串格式输入数值,转为integer64类型后再匹配 as.integer64("6969277959563657216") %in% as.integer64(c( "6972646901044805634", "6935914801507893250", "6930019021496532993", "6969277959563657217", "7005257783989764866" )) # 输出: FALSE
内容的提问来源于stack exchange,提问作者L.Yang
相关产品推荐
相关产品推荐

