最近一位同学在使用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);
INSERTINTOcustomer(id,name,age,jinqian)VALUES(1111111111,'uu',15,90.018);

上面两个分别被保存为

  • 总结
    从上面的分析,我们可以得出以下结论:
    1、浮点数存在误差问题;
    2、对货币等对精度敏感的数据,应该用定点数表示或存储;
    3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
    4、要注意浮点数中一些特殊值的处理;

ETL过程中数据精度不准确问题的更多相关文章

  1. 锚点的animate使用过程中定位不准确的问题小记

    源码: $('html, body, .S').animate({ scrollTop: $('.a1').offset().top - 133}, { duration: 1500, easing: ...

  2. BI实施过程中的工具与服务

    成功的BI项目,不仅仅是应用了BI工具软件,还要具备完善的BI服务体系,才能称之为真正成功的商业智能bi项目. 现在的BI(商业智能)比起几年前的ERP一样,成为CIO们关注的焦点.在ERP等基础信息 ...

  3. 在CMMI推广过程中EPG常犯的错误(转)

    本文转自: http://developer.51cto.com/art/200807/86953.htm 仅用于个人收藏,学习.如有转载,请联系原作者. ---------------------- ...

  4. 如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架

    一直准备写这么一篇有关 SSIS 日志系统的文章,但是发现很难一次写的很完整.因为这篇文章的内容可扩展的性太强,每多扩展一部分就意味着需要更多代码,示例和理论支撑.因此,我选择我觉得比较通用的 LOG ...

  5. APP store 上架过程中碰到的那些坑&被拒的各种奇葩原因整理&审核指南中文版

    苹果官方发布的十大常见被拒原因 1.崩溃次数和Bug数量.苹果要求开发者在将应用提交给App Store之前彻查自己的应用,以尽量避免Bug的存在. 2.链或错误的链接.应用中所有的链接必须是真实且有 ...

  6. GoEasy实现web实时推送过程中的自动补发功能

    熟悉GoEasy推送的朋友都知道GoEasy推送实现web实时推送并且能够非常准确稳定地将信息推送到客户端.在后台功能中查看接收信息详情时,可有谁注意到有时候在发送记录里有一个红色的R标志?R又代表的 ...

  7. ETL过程

    ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的过程.ETL一词较常用在数 ...

  8. 微软BI 之SSIS 系列 - 对于平面文件中 NULL 值处理过程中容易极易混淆的几个细节

    开篇介绍 最近有人问我有关文件处理中空值处理的相关问题: OLE DB Destination 中的 Keep Nulls 如何控制 NULL 值的显示? 为什么选中了 Keep Nulls 但是数据 ...

  9. CDN高级技术专家周哲:深度剖析短视频分发过程中的用户体验优化技术点

    深圳云栖大会已经圆满落幕,在3月29日飞天技术汇-弹性计算.网络和CDN专场中,阿里云CDN高级技术专家周哲为我们带来了<海量短视频极速分发>的主题分享,带领我们从视频内容采集.上传.存储 ...

  10. Sybase IQ使用过程中注意事项

    Sybase IQ使用过程中注意事项 1,字母大小写比对不敏感,也就是在值比对判断时大小写字母都一样; 2,等值,或<>判断,系统默认对等式两边比对值去右边空格再进行比较: 3,GROUP ...

随机推荐

  1. php获取前一天,前一个月,前半年,前一年的时间戳

    #获取前一小时strtotime("-1 hour") #获取前一天strtotime("-1 day") #获取前一周strtotime("-1 w ...

  2. 通过引用实现php无限极分类

    /** * 递归加引用实现无限极分类 * @param $items * @return array */ public function getTree2($items) {   $array = ...

  3. 使用 PyInstaller 打包 Python 应用并解决依赖问题

    使用 PyInstaller 打包 Python 应用并解决依赖问题 在 Python 开发中,有时需要将程序打包成独立的可执行文件,以便分发和部署.PyInstaller 是一个广泛使用的工具,可以 ...

  4. Nacos源码—2.Nacos服务注册发现分析二

    大纲 5.服务发现-服务之间的调用请求链路分析 6.服务端如何维护不健康的微服务实例 7.服务下线时涉及的处理 8.服务注册发现总结 5.服务发现-服务之间的调用请求链路分析 (1)微服务通过Naco ...

  5. 代码随想录第二十三天 | Leecode 39. 组合总和、40.组合总和II、131. 分割回文串

    Leecode 39. 组合总和 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 ...

  6. kubernetes理论

    kubernetes特性:自动装箱,自我修复,自动水平扩展,自动服务发现,服务自动负载均衡,自动发布和回滚 秘钥和配置管理,存储编排,批量处理执行 kubernetes架构:master/node m ...

  7. Python3 + selenium 获取疫情中高风险区数据

    背景: 需要动态将疫情风险区数据和区域业务动作想结合, 赋能销售业务, 内部使用非商用哈 环境: Python3 + selenium 自动化测试软件中 Chrome 驱动 exe 文件 输出: 以 ...

  8. SQL 强化练习 (十)

    这一周都被客户搞得很惨.... 项目主流程不推进, 尽搞一些无关紧要的事情, 什么界面 ui 美化, 增加什么按钮进度条, 模糊查询...各种乱七八糟的需求, 挡都挡不住呀... 真的是把我当全栈使了 ...

  9. Web前端入门第 53 问:JavaScript 的各种调试方法

    任何一门编程语言,在学习之前都应该先弄清楚它的调试方法,毕竟没有不挖坑的人类! 程序一旦出现问题,第一时间就是找到问题出在哪儿,其次才是拿出解决办法.如果都找不到问题原因,那又何从谈起解决办法呢? 如 ...

  10. 2003 can't connect to mysql server on

    把配置文件my.ini换成如下所示: mysql和mysql数据存放路径都是加双斜线 [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mys ...