PostgreSQL 14中浮点类型除法舍入结果的疑问与求解
PostgreSQL 14中19/3运算的舍入问题解析
问题1:为何出现看似异常的舍入结果
这本质是单精度(real/float4)和双精度(double precision/float8)浮点数的精度差异导致的:
real是32位单精度浮点数,有效十进制位数仅约6-7位,无法精确存储无限循环的6.333333...,只能用最接近的二进制浮点数近似表示。- 当运算中存在
integer和real混合时,PostgreSQL会自动将integer提升为double precision,整个运算在双精度环境下执行(双精度有15-17位有效十进制位数),因此结果能保留更多小数位,显示为6.333333333333333。 - 当两个操作数都是
real,或把双精度结果转成real时,结果会被截断/舍入到单精度能表示的最接近值,也就是6.3333335——这是单精度浮点数对6.333333...的最优近似,并非“极端异常”,而是符合浮点数的存储规则。
问题2:19::real / 3的结果数据类型
结果类型是double precision(别名float8)。
PostgreSQL的类型提升规则明确:当操作数分别为real(float4)和integer时,会将integer转换为double precision,运算全程以双精度执行,最终输出双精度类型的结果,这也是该运算结果和double precision运算结果一致的原因。
内容的提问来源于stack exchange,提问作者John Chenault
相关产品推荐
相关产品推荐

