为什么R读取文本文件数值时,显示的精度比原始输入更高?
问题原因解答
这个现象是IEEE 754双精度浮点数的固有存储特性导致的,所有遵循该标准的编程语言都会出现同类表现,和R的文件读取、输出逻辑没有关联。
具体原理如下:
- R的默认数值类型为双精度浮点数,采用二进制格式存储小数,绝大多数十进制有限小数都无法被二进制精确表示,只能存储和原始值最接近的二进制近似值。
- 你输入的
4.12448729726923就属于无法被二进制精确表示的十进制小数,双精度浮点数仅有53位有效二进制位,对应约15~17位十进制有效数字,底层实际存储的是和原始值误差最小的二进制近似值。 - 默认输出精度下,R会自动对数值做舍入处理,输出结果刚好和你输入的原始值一致;当你把输出精度调整到20位,已经超过了双精度能保证的十进制精确位数,此时输出的是存储的二进制近似值完整转换为十进制的结果,自然会出现超出原始输入的额外小数位,末尾数字也会和原始输入有差异。
你可以通过以下简单代码验证,不需要读取文件就能得到和你测试完全一致的结果:
options(digits = 20) 4.12448729726923
如果业务场景需要完全精确存储十进制小数,可以使用支持任意精度十进制运算的扩展包如Rmpfr,但对应的运算速度会比原生双精度浮点数慢很多。
内容的提问来源于stack exchange,提问作者swolf
相关产品推荐
相关产品推荐

