PostgreSQL中extra_float_digits参数可以用来控制浮点数输出的精度,可能我们在平时使用中并不太会留意,那我们下来看下面这个例子。

建一张表,两个字段类型分别是float和numeric,然后插入数据

bill@bill=>create table t1(c1 float,c2 numeric);
CREATE TABLE
bill@bill=>insert into t1 values(0.55555555555555555,0.55555555555555555);
INSERT 0 1

接下来我们去查询,你就会发现查出来的数据竟然和我们插入的不一样了!

bill@bill=>select * from t1;c1         |         c2
-------------------+---------------------0.555555555555556 | 0.55555555555555555
(1 row)

好像这样看上去并没有什么,但是会很容易给我们产生误导,让你以为c1字段插入的值是0.555555555555556,其实并不是。可以看到下面的查询并没有记录。

bill@bill=>select * from t1 where c1 >= 0.555555555555556;c1 | c2
----+----
(0 rows)

这是为什么呢?其实表中存的数据还是原先的0.55555555555555555,只是显示出来错误了,所以我们要这样去查询:

bill@bill=>select * from t1 where c1::numeric >= 0.555555555555556;c1         |         c2
-------------------+---------------------0.555555555555556 | 0.55555555555555555
(1 row)

所以这种情况下我们就特别需要注意float类型的精度了!

接下来我们言归正传,看看extra_float_digits这个参数。

介绍这个参数前,我们需要知道在pg中float4默认精确到6位数字,float8精确到15位数字,这也是和大多数平台是一样的。

bill@bill=>select 12.23333333333333::float(24);float4
---------12.2333
(1 row)bill@bill=>select 12.23333333333333::float(25);float8
------------------12.2333333333333
(1 row)

这里要注意下,float()中的数字并不表示精度,而是表示存储浮点数的比特位数。而且在PostgreSQL中这个值并没有意义,只是用来区分它是float4还是float8而已。在pg中1到24个比特位表示float4,25到53个比特位表示float8。


而要控制float类型的精度便是需要通过extra_float_digits参数了。

extra_float_digits取值范围为-15~3,默认是0。等于0时float4精确到6位数字,float8精确到15位数字。增大该值则会增加精确的位数,减小则会降低精度,例如设置该值为3,则float4精确到9位数字。

–float4类型:

bill@bill=>do
bill-# $$
bill$# declare i int;
bill$# begin
bill$# for i in -15..3 loop
bill$# perform set_config('extra_float_digits',i::text, 'true');
bill$# raise notice 'extra_float_digits = %, result = %', i, 1.333333333333333::float(24);
bill$# end loop;
bill$# end;
bill$# $$language plpgsql;
NOTICE:  extra_float_digits = -15, result = 1
NOTICE:  extra_float_digits = -14, result = 1
NOTICE:  extra_float_digits = -13, result = 1
NOTICE:  extra_float_digits = -12, result = 1
NOTICE:  extra_float_digits = -11, result = 1
NOTICE:  extra_float_digits = -10, result = 1
NOTICE:  extra_float_digits = -9, result = 1
NOTICE:  extra_float_digits = -8, result = 1
NOTICE:  extra_float_digits = -7, result = 1
NOTICE:  extra_float_digits = -6, result = 1
NOTICE:  extra_float_digits = -5, result = 1
NOTICE:  extra_float_digits = -4, result = 1.3
NOTICE:  extra_float_digits = -3, result = 1.33
NOTICE:  extra_float_digits = -2, result = 1.333
NOTICE:  extra_float_digits = -1, result = 1.3333
NOTICE:  extra_float_digits = 0, result = 1.33333
NOTICE:  extra_float_digits = 1, result = 1.3333334
NOTICE:  extra_float_digits = 2, result = 1.3333334
NOTICE:  extra_float_digits = 3, result = 1.3333334
DO

–float8类型:

bill@bill=>do
bill-# $$
bill$# declare i int;
bill$# begin
bill$# for i in -15..3 loop
bill$# perform set_config('extra_float_digits',i::text, 'true');
bill$# raise notice 'extra_float_digits = %, result = %', i, 1.333333333333333::float(25);
bill$# end loop;
bill$# end;
bill$# $$language plpgsql;
NOTICE:  extra_float_digits = -15, result = 1
NOTICE:  extra_float_digits = -14, result = 1
NOTICE:  extra_float_digits = -13, result = 1.3
NOTICE:  extra_float_digits = -12, result = 1.33
NOTICE:  extra_float_digits = -11, result = 1.333
NOTICE:  extra_float_digits = -10, result = 1.3333
NOTICE:  extra_float_digits = -9, result = 1.33333
NOTICE:  extra_float_digits = -8, result = 1.333333
NOTICE:  extra_float_digits = -7, result = 1.3333333
NOTICE:  extra_float_digits = -6, result = 1.33333333
NOTICE:  extra_float_digits = -5, result = 1.333333333
NOTICE:  extra_float_digits = -4, result = 1.3333333333
NOTICE:  extra_float_digits = -3, result = 1.33333333333
NOTICE:  extra_float_digits = -2, result = 1.333333333333
NOTICE:  extra_float_digits = -1, result = 1.3333333333333
NOTICE:  extra_float_digits = 0, result = 1.33333333333333
NOTICE:  extra_float_digits = 1, result = 1.333333333333333
NOTICE:  extra_float_digits = 2, result = 1.333333333333333
NOTICE:  extra_float_digits = 3, result = 1.333333333333333
DO

此外,pg12开始,支持在pg_dump时加上 --extra-float-digits选项,用来控制导出的数据中float的精度,例如:

pg_dump -d bill -t t5 --inserts --extra-float-digits -12 -f t5_1231.txt

-- Data for Name: t5; Type: TABLE DATA; Schema: public; Owner: bill--INSERT INTO public.t5 VALUES (1.23);INSERT INTO public.t5 VALUES (1.24);INSERT INTO public.t5 VALUES (1.57);

参考链接:
http://www.postgres.cn/docs/12/runtime-config-client.html#RUNTIME-CONFIG-CLIENT-FORMAT
http://www.postgres.cn/docs/12/datatype-numeric.html

PostgreSQL extra_float_digits——控制浮点数精度相关推荐

  1. c语言对浮点数截断,C语言中浮点数精度进行截断输出

    今日在做ACM/ICPC的题目时,遇到了这样的情况:程序求得的结果是一个浮点数,但题目要求以整数形式输出(取不小于该结果的最小整数).这是个很简单的问题.也许很多人会采用float强制转型为int再加 ...

  2. pandas中set_option的常用设置:显示所有行、显示所有列、控制浮点型精度、每个数据元素的显示字符数、对齐形式等

    pandas中set_option的常用设置:显示所有行.显示所有列.控制浮点型精度.每个数据元素的显示字符数.对齐形式等 #pandas中set_option的常用设置 详细参考pandas API ...

  3. 计算价格, java中浮点数精度丢失的解决方案

    计算价格, java中浮点数精度丢失的解决方案 转载于:https://www.cnblogs.com/gloryhope/p/9896719.html

  4. js浮点数精度丢失问题及如何解决js中浮点数计算不精准

    js浮点数精度丢失问题及如何解决js中浮点数计算不精准 参考文章: (1)js浮点数精度丢失问题及如何解决js中浮点数计算不精准 (2)https://www.cnblogs.com/ranyonsu ...

  5. 浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

    在知乎上上看到如下问题: 浮点数精度问题的前世今生? 1.该问题出现的原因 ? 2.为何其他编程语言,比如java中可能没有js那么明显 3.大家在项目中踩过浮点数精度的坑? 4.最后采用哪些方案规避 ...

  6. Python中浮点数精度处理

    from: Python中浮点数精度处理 Python中,浮点数运算,经常会碰到如下情况: 出现上面的情况,主要还是因浮点数在计算机中实际是以二进制保存的,有些数不精确. 比如说: 0.1是十进制,转 ...

  7. java 浮点数精度_Java中浮点数精度问题

    Java中浮点数精度问题 Java中的简单浮点数类型float和double不能够进行运算.不光是Java,在其它很多编程语言中也有这样的问题.如下图所示: public class DataRang ...

  8. 用decimal模块增加python的浮点数精度

    浮点数python默认是17位精度,也就是小数点后16位(16位以后的全部四舍五入了),虽然有16位,但是这个精度越往后越不准. 如果有特殊需求,需要更多的精度,可以用decimal模块,通过更改其里 ...

  9. python3的float数精度_Python numpy 浮点数精度问题

    Python numpy 浮点数精度问题 在复现FP(fictitious play, Iterative solution of games by fictitious play-page393)算 ...

  10. python3的float数精度_python浮点数精度问题

    python浮点数的计算,结果并不像我们想象的那样,比如: >>> 0.25+0.25-0.4 0.09999999999999998 >>> 0.6+0.3-0. ...

最新文章

  1. PHP 发邮件《转》
  2. [方法提炼] 获取Android设备序列号方法
  3. Linux ffmpeg的安装编译过程
  4. go语言io reader_go语言之IO操作(待补充)
  5. 保障危险品的物流安全问题,大数据扮演了重要角色
  6. MySQL慢查询之慢SQL定位、日志分析与优化方案
  7. 全网最详细的HBase启动以后,HMaster进程启动了,几秒钟以后自动关闭问题的解决办法(图文详解)
  8. 学习c++一点一滴----读取注册表
  9. C#使用SQLServer2016
  10. SaaS销售迎来破局 渠道分销重回主场
  11. “真正的”欧洲杯,鸡冻不鸡冻?
  12. 问题 B: 神棍的纯真愿望
  13. Hello December
  14. 【iOS 1 行代码系列】之 一行代码搞定TableView组头悬停
  15. xunsearch使用流程
  16. altium 去掉部分铺铜_DCS系统接地(四部分)
  17. MATLAB应用——曲线长度的求解
  18. matlab 区域生长算法生成二值图像边界区域
  19. 经典的arena内存池实现-levelDB的内存池实现
  20. 录屏软件哪个好?试试这6款录屏软件,小编亲测(2023已更新)

热门文章

  1. Ubuntu环境下Android反编译apk教程
  2. python - jpg图片转pdf
  3. android 编译 libjpeg-turbo,编译Android环境的libjpeg-turbo
  4. Unity调用打印机
  5. win10 64位 JavaJDK的下载、安装与配置。
  6. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例
  7. Android 签名
  8. (QT学习笔记):QListWidget、QTreeWidget、 QTableWidget的基本使用
  9. foobar2000 常用插件搜集
  10. 【雷达与对抗】【2014.06】荷兰人工育滩工程Sand Motor的X波段雷达深度反演模型研制