背景
之前写过一篇文章介绍PostgreSQL浮点类型存储值和表述值不一致带来的问题。
请参考:
浮点精度,在大多数平台中,float4精确到6位数字,float8精确到15位数字。
On most platforms, the real type has a range of at least 1E-37 to 1E+37 with a precision of at least 6 decimal digits. The double precision type typically has a range of around 1E-307 to 1E+308 with a precision of at least 15 digits.
使用extra_float_digits 参数最多可以增加3位精度。
语法方面,PostgreSQL兼容IEEE的用法。支持在float()中输入bit位。
代码如下,1到24个比特位表示float4,25到53个比特位表示float8:
src/backend/parser/gram.y
opt_float: '(' Iconst ')'
{
/*
* Check FLOAT() precision limits assuming IEEE floating
* types - thomas 1997-09-18
*/
if ($2 < 1)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("precision for type float must be at leas