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

news2025/1/12 6:12:04

最近碰到同事发来这样两个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.coloradmin.cn/o/1132314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CDN加速技术:国内外优劣势

在当今数字化时代,网站速度和性能对于用户体验和在线业务的成功至关重要。为了提供更快速的内容交付和优化用户体验,内容分发网络(CDN)技术应运而生。本文将分析CDN的国内外优劣势,探讨其价格因素,并通过实…

由浅入深,全面解析AMBA ACECHI协议

IC工程师,在设计芯片时,如果是基于各种复用IP的SOC芯片,那必定要接触到AMBA总线协议。 AMBA总线是由ARM公司提出的一种开放性的片上总线标准,它独立于处理器和工艺技术,具有高速度低功耗等特点。协议的主要动机是用一…

Android build.gradle读取String中文件及gradle.properties数据

在网上找了好久没有一个完整的学习文档,自己总结下,方便后面使用,话不多说直接上代码 首先获取路径 def path getProjectDir().getPath()"/src/"variant.productFlavors[0].name"/res/values/strings.xml"System.out…

音视频(二)之使用FFMpegSDK在我们自己的代码中进行推流

前言 上一篇文章我们介绍了如何使用FFMpeg工具进行推流。但如果要在我们的代码工程中,实现推流。就要下载FFMpegSDK包,调用相关API,在我们自己的程序中实现推流。 FFMpegSDK下载 下载动态库文件 选择这个下载 使用FFMpegSDK推流 下载FF…

jacob朗读中文,jacob生成中文语音音频文件,以生成MP3文件为例,不需要配置DLL

前言 本文使用jacob朗读文字和生成中文语音音频文件功能,与不同的是,本文不需要配置DLL到JVM根目录,只需要从项目类路径加载DLL即可。 jacob介绍 Jacob 是一个 Java 库,允许 Java 应用程序与Microsoft Windows DLL 或 COM 库进行通信。它通过使用自定义DLL来实现这一点,…

docker镜像仓库

Hlarbor harbor是一个开源的云原生镜像仓库, 它允许仓库用户存储,使用docker镜像。可以将harbor看做是私有的dockerhub,它提供了更新安全性和控制性, 让组织能够安全的存储和管理镜像。 harbor RBAC:基于角色访问控制…

ImportError: DLL load failed: 找不到指定的模块。解决方法 from ._nnls import nnls 报错

实验时遇到过如下错误 ImportError: DLL load failed: 找不到指定的模块。 往前查看错误位置发现如下错误 from ._nnls import nnls 或者 from scipy import special, optimize, from ._nnls import nnls 解决方法: 依次执行下述命令 conda remove --force numpy …

[大三上]区块链和分布式计算

[大三上]区块链和分布式计算 区块链中的分布式系统: 分布式最大的应用: 区块链, 分布式系统是区块链的一个基础 分布式计算: 分布式计算(Distributed Computing):指将一个计算任务分解成多个子任务,分配给不同的计算节点&#…

项目管理-2023西电网课课后习题答案-第三章

文章目录 第三章答案1-1011-2021-3031-4041-5051-6061-7071-80 [✅] 第一章答案[✅] 第二章答案[✅] 第三章答案[✅] 第四章答案 第五章答案 第三章答案 1-10 11-20 21-30 31-40 41-50 51-60 61-70 71-80

VSCode 自动修改闭合标签

1.打开应用商店,搜索 auto rename tag ,选择第一个,点击安装。 2.安装完毕后随便打开一个 HTML 文件,当我们修改起始标签时,闭合标签也会自动更改。 原创作者:吴小糖 创建时间:2023.10.25

高德 几千条数据,点标记Marker转海量标注 LabelMarker

** 高德地图说: 当需要在地图添加千级以上的点标记时,LabelMarker 是代替 Marker 的更好选择。 ** 如图,当数据量超过两千时,如果我们使用的是Marker点标记,页面将会非常的卡,卡顿很久都不出现标记点。因此…

NFS网盘挂载-Ubuntu(linux)

我有2台机器,我想把A机器挂载到B机器上。 NFS安装 B机器执行-服务端:sudo apt-get install nfs-kernel-server A机器执行-客户端:sudo apt-get install nfs-common 指定共享盘 进入B机器,配置共享盘 创建需要让别人访问的目录…

Pytorch:model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别

1 model.train() 和 model.eval()用法和区别 1.1 model.train() model.train()的作用是启用 Batch Normalization 和 Dropout。 如果模型中有BN层(Batch Normalization)和Dropout,需要在训练时添加model.train()。model.train()是保证BN层能够用到每一…

时尚女童卫衣—Get麻麻同款和宝贝一起穿

分享女儿的时尚穿搭—卫衣 不知道各位姐妹那边的天气如何 我们这边现在穿卫衣刚刚好 这件卫衣百搭圆领,经典的额版哦 加绒卫衣特别保暖 卡通鹅的图案宝贝特别喜欢 和宝贝一起穿亲子装真的很幸福!

记录一次“超出内存限制”的原因

问题: 问题的来源是力扣的这一条题目:LCR 048. 二叉树的序列化与反序列化 - 力扣(LeetCode) 我寻思着也没啥,就前序遍历呗,时间和空间复杂度都是O(n),应该能把题目K掉。 问题代码: /*** Defini…

InCopy 2024 v19.0.0.151(文案撰写与编辑软件)

InCopy 2024 for Mac是一款文案撰写与编辑软件,适用于在Mac上进行文字编辑和排版工作。它是Adobe Creative Cloud套件中的一部分,主要面向文字编辑人员、作家和出版团队,提供了一系列强大的功能,以协同工作和改进工作流程。 InCo…

学校巡课工具,这次真包教包会!

随着教育领域的不断发展和科技的快速进步,在线巡课系统已经成为一种强大的工具,为学校、教育机构和教育者提供了全新的教学监督和评估方式。 客户案例 中学巡课项目 成都某中学面临着监督和改进教学质量的挑战。泛地缘科技推出的在线巡课系统&#xff0c…

欧拉图相关的生成与计数问题探究

最近学了一波国家集训队2018论文的最后一个专题。顺便带上了一些我的注解。 先放一波这个论文 1.基本概念 欧拉图问题是图论中的一类特殊的问题。在本文的介绍过程中,我们将会使用一些图 论术语。为了使本文叙述准确,本节将给出一些术语的定义。 定义…

嵌入式软件找实习需要掌握哪些知识?

嵌入式软件找实习需要掌握哪些知识? 嵌入式软件实习暂时不用刷力扣。具体需要掌握哪些知识每个公司的要求都不太一样,因为嵌入式也有很多细分领域,单片机、C语言是需要熟悉的,最近很多小伙伴找我,说想要一些嵌入式资料…

基于springboot实现篮球论坛管理系统项目【项目源码+论文说明】

基于springboot实现篮球论坛管理系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗…