为何R读取Excel数值时出现小数位膨胀,与原数据不一致?
问题原因解析:Excel与R的数值精度差异
这不是R读取数据时额外增加了精度,核心原因是浮点数的二进制存储特性,具体细节如下:
- 不管是Excel还是R,都是采用IEEE 754标准的二进制浮点数来存储小数,但很多十进制小数无法被二进制精确表示(比如0.1的二进制是无限循环的)。你手动输入的
34.691就是这类无法被二进制精确存储的数值。 - Excel会默认按照你输入的格式(保留3位小数)显示数值,不会暴露底层存储的近似二进制值;但R会直接展示这个近似值的十进制形式,所以你看到了
34.690999999999995——这只是存储的近似值,并非R额外添加了精度。 - 求和结果不一致是因为这种微小的精度误差在累加时会被放大。Excel在计算过程中可能会自动做舍入处理,或者最终显示结果时截断了小数位;而R会基于原始的近似值完成计算,所以两者的求和结果会出现差异。
如果要让R的求和结果和Excel一致,可以用round()函数把数值保留3位小数后再计算:
round(mysheets[["df1"]]$目标列名, 3) %>% sum()
内容的提问来源于stack exchange,提问作者Helmasan
相关产品推荐
相关产品推荐

