当前位置: 首页 > news >正文

PostgreSQL12中浮点数输出算法优化带来的小问题

最近碰到同事发来这样两个SQL,开发反馈输出的结果异常。

bill=# select 0.1284*100::float;?column?
--------------------12.839999999999998
(1 row)bill=# select (0.1284*100)::float;float8
--------12.84
(1 row)

乍一看其实能看出明显的区别,由于::符号的优先级是高于*的,所以没加括号导致结果不同。但是对于第一个SQL输出的结果却很奇怪,为什么会输出这样一个数字?而且将0.1284改成0.1184也不会有问题,这就让人有点费解了。

bill=# select 0.1184*100::float;?column?
----------11.84
(1 row)

于是我在几个不同版本的pg实例中测试了下,发现pg12及以后的版本均有这种情况,于是看了下12的release notes,发现如下的更新

可以看到,在pg12中使用新的算法输出real和double precision值来提高性能。同时对于extra_float_digits这个参数也有原先默认的0改成了现在默认为1。关于这个参数的含义及用法之前我也有写过文章说明过,这里就不在阐述。

按照官方建议,可以将该参数设置为0与原先低版本保持一致。

bill=# show extra_float_digits ;extra_float_digits
--------------------1
(1 row)bill=# set extra_float_digits = 0;
SET
bill=#  select 0.1284*100::float;?column?
----------12.84
(1 row)

那么还有最后一个问题,为什么前面会输出12.839999999999998这么一串数字呢?可以看到前面的说明中有提到,当extra_float_digits大于零时(现在是默认值),只输出保留精确二进制值所需的最小数字。

这个是什么意思呢,由于前面我们输出的是float类型,当extra_float_digits=1时最多保留17位,但是由于新的浮点数输出算法,只要二进制相同,那么只保留到能得到该二进制的最小位数即可。

换句话说,12.839999999999998和12.84的二进制值是一样的,大家可以计算下,都是1100.110101110000101001,也就是说对于该数而言,两者是相等的。从下面也可以验证。

bill=# select 12.839999999999998::float;float8
--------12.84
(1 row)

http://www.lryc.cn/news/205766.html

相关文章:

  • Hive安装配置笔记
  • 前端数据可视化之【Echarts下载使用】
  • 本机计算机上的mysql启动后停止
  • Java中ReentrantLock测试线程的安全
  • Vue-dvadmin-d2-crud-plus-常用配置-row-handle-columns-options
  • 【OpenCV实现图像的算数运算,性能测试和优化,改变颜色空间】
  • 多级缓存入门
  • CentOS卸载LVM磁盘的方法
  • ChatGPT:Spring Boot和Maven——Java应用开发的关键工具和区别
  • 智能振弦传感器:参数智能识别技术的重要科技创新
  • tooltip实现悬停内容染色
  • “深入探讨Java JUC中的ReentrantLock锁:实现多线程同步与并发控制“
  • Java|学习|多线程
  • 【Python机器学习】零基础掌握VotingClassifier集成学习
  • 深入了解JavaScript中的AJAX和HTTP请求
  • 第87步 时间序列建模实战:LSTM回归建模
  • GB/T28181协议介绍
  • 光致发光荧光量子检测的作用
  • 深度学习第四课
  • Linux创建临时文件mkstemp()tmpfile()
  • js的节流和防抖详解
  • 基于SpringBoot的水果销售网站
  • vue2进阶学习知识汇总
  • SQL SERVER连接oracle数据库几种方法
  • 存储优化知识复习三详细版解析
  • HotReload for unity支持的代码修改
  • 写一个呼吸灯要几行代码?
  • Banana Pi BPI-W3(Armsom W3)RK3588开当板之调试UART
  • LeetCode88——合并两个有序数组
  • C++ BinarySercahTree recursion version