为什么在Postgres中选择一个真正的类型只能打印出最多6位数字



我有一个Postgres表,它有一列real类型。

当我使用查询从该列中选择值(例如select amount from my_table(时,它会对大于100000的数字进行四舍五入。(它完全忽略了小数部分(。对于大于1000000的数字,它使用科学记数法显示它们。对于小于100000的数字,它会去掉小数部分,这样总共只打印出最多6位数字(例如1000.12345变成1000.12(

只有当我将值强制转换为双精度(使用CAST(amount as double precision)(时,它才会开始像我预期的那样工作,并打印出所有存储的十进制数字。

有人知道为什么Postgres会这样做吗?

答案可能在PostgreSQL源代码postgres/src/feutils/print.c中。format_numeric_locale的评论说:

/*
* Format a numeric value per current LC_NUMERIC locale setting
*
* Returns the appropriately formatted string in a new allocated block,
* caller must free.
*
* setDecimalLocale() must have been called earlier.
*/

另请参见setDecimalLocale中的注释。

SQL标准中也可能存在一些原因。

可以,但对于PG 12.2,实精度和双精度之间存在一些格式差异:

# select x, x::double precision from t order by 1;
x       |      x      
---------------+-------------
123456 |      123456
999999 |      999999
1e+06 |     1000000
1.000001e+06 |     1000001
1.234567e+06 |     1234567
1.2345671e+06 | 1234567.125
1.234568e+06 |     1234568
9.999999e+06 |     9999999
9.999999e+06 |     9999999
1e+08 |   100000000
1.2345679e+09 |  1234567936
1.2345679e+09 |  1234567936
(12 rows)

看起来你可以有7位小数的精度。

最新更新