我有一个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位小数的精度。