PostgreSQL中real数据类型精度概念困惑及输出疑问
PostgreSQL real数据类型精度的常见误解解析
先看你执行的SQL代码:
CREATE TABLE number_data_types ( numeric_column numeric(20,5), real_column real, double_column double precision ); INSERT INTO number_data_types VALUES (.7, .7, .7), (2.13579, 2.13579, 2.13579), (2.1357987654, 2.1357987654, 2.1357987654); SELECT * FROM number_data_types;
你疑惑的核心点在于对real类型精度的误解,具体解析如下:
1. real类型的“精度6”是近似有效数字范围,而非固定位数
PostgreSQL的real是基于IEEE 754标准的单精度浮点数,它的近似精度为6-7位有效数字,不是严格固定的6位。有效数字是从第一个非零数字开始计数的所有数字,比如2.1357987包含7位有效数字,这在real的精度覆盖范围内。
你之前误以为“精度6”是只能保留6位数字(或小数点后6位),但实际上有效数字是对整个数值的位数统计,real类型可以表示到7位有效数字的近似值。
2. PostgreSQL浮点数的输出逻辑:最短精确十进制表示
教材中提到:“在第三行,你可以看到PostgreSQL在这两列中的默认行为,即用最短的精确十进制表示法输出浮点数,而非显示完整值。”
PostgreSQL不会直接输出浮点数存储的二进制原始值的全部十进制展开,而是选择最短的十进制字符串——这个字符串转换回二进制浮点数时,能得到数据库中实际存储的那个值。
对于你插入的2.1357987654,存储为real后,对应的二进制浮点数的最短精确十进制表示就是2.1357987,而不是你预期的2.13579(因为2.13579转换为real后,和实际存储的数值并不完全一致)。
简单来说,PostgreSQL显示的是能准确还原存储值的最短写法,而非截断到你理解的6位数字。
内容的提问来源于stack exchange,提问作者aurumpurum
相关产品推荐
相关产品推荐

