当前位置:网站首页>ETL过程中数据精度不准确问题
ETL过程中数据精度不准确问题
2022-06-26 14:51:00 【RestCloud】
最近一位同学在使用Restcloud ETL产品做数据集成,出现数据传输到目标库表后,数据精度不准确问题。
场景为:从oracle源表数据 格式为:number(21,6)将数据同步到mysql目标表数据格式为:float(21,6) ; 同步数据 发现 oracle是:538121.47 同步到mysql数据库中:538121.50,看到这里,不免有些同学会认为是产品的问题,我们一起来分析下。
首先,我们需要了解下数据在计算机中的区别。在计算机内部,小数有两种表示方法: 定点数和浮点数。
1、浮点型(float和double) 浮点型在数据库中存放的是近似值
MySQL数据类型 含义
float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d⼩数位
double(m,d) 双精度浮点型 16位精度(8字节) m总个数,d⼩数位
设⼀个字段定义为float(5,3),如果插⼊⼀个数123.45678,实际数据库⾥存的是123.457,但总个数还以实际为准,即6位。
2、定点数 定点类型在数据库中存放的是精确值
浮点型在数据库中存放的是近似值,⽽定点类型在数据库中存放的是精确。decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是⼩数位。
对于单精度浮点数Float: 当数据范围在±131072(65536×2)以内的时候,float数据精度是正确的,但是超出这个范围的数据就不稳定,没有发现有相关的参数设置建议:将float改成double或者decimal,两者的差别是double是浮点计算,decimal是定点计算,会得到更精确的数据。
下面使用分析,首先创建测试表
CREATE TABLE customer ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(45) DEFAULT NULL, age int(11) DEFAULT NULL, jinqian float(5,2) DEFAULT NULL, PRIMARY KEY (id) );
float(m,d)
m表示的是最大长度,d表示的显示的小数位数。
例如上面的sql里:float(5,2) 表示:这个浮点数最大长度为5,也就是五位,然后小数部分为2位,至于存储范围,取决于你是否定义了无符号。
无符号的话,最小是0.0 最大能存储到99999.9,如果有符号的话,范围是:-99999.9至99999.9。
默认大小为24位数字,精度大约7位数字(经测试为6位),当设置M大小大于24时,自动转换为DOUBLE类型;同时设置M和D时不进行自动转换。
小数位超过设定值,按四舍五入保存
INSERTINTO customer (id,name,age,jinqian)VALUES(111111111,'uu',15,90.012);
INSERTINTO customer(id,name,age,jinqian)VALUES(1111111111,'uu',15,90.018);
上面两个分别被保存为
总结
从上面的分析,我们可以得出以下结论:
1、浮点数存在误差问题;
2、对货币等对精度敏感的数据,应该用定点数表示或存储;
3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
4、要注意浮点数中一些特殊值的处理;
边栏推荐
- Authoritative announcement on the recruitment of teachers in Yan'an University in 2022
- Pod of kubernetes
- Numpy基本使用
- Talk about the RPA direction planning: stick to simple and valuable things for a long time
- R语言使用glm函数构建泊松对数线性回归模型处理三维列联表数据构建饱和模型、使用step函数基于AIC指标实现逐步回归筛选最佳模型、使用summary函数查看简单模型的汇总统计信息
- Redis事务与watch指令
- 乐鑫 AWS IoT ExpressLink 模组达到通用可用性
- 印尼投资部长:鸿海考虑在其新首都建立电动公交系统、城市物联网
- 一个快速切换一个底层实现的思路分享
- Get the intersection union difference set of two dataframes
猜你喜欢

The JVM outputs GC logs, causing the JVM to get stuck. I am stupid

Electron

View touch analysis

JVM 输出 GC 日志导致 JVM 卡住,我 TM 人傻了

The heavyweight white paper was released. Huawei continues to lead the new model of smart park construction in the future

Program analysis and Optimization - 8 register allocation
![[cloud native] codeless IVX editor programmable by](/img/10/7c56e46df69be6be522a477b00ec05.png)
[cloud native] codeless IVX editor programmable by "everyone"

C语言刷题随记 —— 乒乓球比赛

权威发布 | 延安大学2022年教师岗位招聘公告

Attention meets geometry: geometry guided spatiotemporal attention consistency self supervised monocular depth estimation
随机推荐
北京银行x华为:网络智能运维夯实数字化转型服务底座
TS common data types summary
Excerpt from three body
Kubernetes的pod调度
【云原生】 ”人人皆可“ 编程的无代码 iVX 编辑器
子查询的使用
View触摸分析
聊聊 RPA 方向的规划:简单有价值的事情长期坚持做
Unity UnityWebRequest 下载封装
Notes on writing questions in C language -- table tennis competition
详解C语言编程题:任意三条边能否构成三角形,输出该三角形面积并判断其类型
teamviewer显示设备数量上限解决方法
一个快速切换一个底层实现的思路分享
Extended hooks
乐鑫 AWS IoT ExpressLink 模组达到通用可用性
[solo π] ADB connects multiple mobile phones
Kubernetes的pod
The annual salary of 500000 is one line, and the annual salary of 1million is another line
What is the ranking of Guosen Securities? Is it safe to open a stock account?
Pod of kubernetes
