ODPS double类型转型精度问题总结

ODPS double类型转型精度问题总结简介:ODPSdouble类型转型精度问题总结从相差0.0000000000001说起,本文主要是对odps的Double和Decimal的精度使用问题做一个总结。1.问题描述客户开发人员在使用maxcompute对double数据类型求和时出现错误(数据表由oracle数据库抽取到maxcompute,对应字段类型为number到double),正确的结果是1943.38,但求和结果为1943.3799999999999,结果相差了0.0000000000001,这个…

大家好,又见面了,我是你们的朋友全栈君。

简介: ODPS double类型转型精度问题总结

 

image.png

 

从相差0.0000000000001说起,本文主要是对odps的Double和Decimal的精度使用问题做一个总结。

1. 问题描述

客户开发人员在使用maxcompute对double数据类型求和时出现错误(数据表由oracle数据库抽取到maxcompute, 对应字段类型为number到double),正确的结果是1943.38,但求和结果为1943.3799999999999,结果相差了0.0000000000001,这个差值的比例可以这样类比——如果地球的周长(40076.02千米)作为单位1的话,那么误差换算出来是4微米,差不多是一个红细胞的大小。绝大多数的情况下,我们可以忽略这个问题,但是在金融线,“差一微米也不行”。

2. 问题的根因:double求和带来精度问题

double适合做科学计算,如果用来进行精确计算,会带来精度丢失的问题。二进制的浮点数计算标准是IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985),IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现),double类型通常指“双精确度(64位)”,53位有效数字。要理解double的精度问题,我们从最基础的二机制与十进制转换看起,比如:如何用二进制表示0.1?小数是用整数除法来表示的,0.1=1/10(十进制)=1/1010(二进制),会得到一个除不尽的值,用double类型来表示这个数的时候就必须要进行截断(舍入),得到的结果是0.00011001100110011001100110011001100110011001100110011010,如果把结果转回十进制,会发现这个值已经不是0.1,精度问题产生了。同理,double类型在进行计算也会造成同样的精度问题。

3. 如何解决——double转型decimal

double计算会有精度问题,为了得到精确的结果,就要在计算之前进行处理,转换成无损计算的类型之后,再进行计算,maxcompute提供了这种无损类型——decimal。

3.1 double直接转成decimal再次遇到问题

不幸的是,直接转型会遇到以下两个问题:
1)转型也会有精度损失。
2)同列的某些值看起来没有精度损失,另一些有,出现表现不一致的情况。

 

image.png

 

  • double直接转decimal会带来精度损失,因为double的小数位有效位比decimal要少,decimal会对最后的几位进行随机数补齐,引入了精度问题。
  • 同列中某些值没有出现任何精度损失,因为客户使用了2.0数据类型版本,在这个版本中maxcompute对转换进行了优化,对位数较小的数(测试结果为7位,供参考)采用了不同的转型算法(类似decimal的处理方法,转换成整数进行计算,保证无损)。位数较大的数无法采用该算法,标准算法处理,会出现精度损失。

4. 转换成decimal就大功告成了么?

4.1 incompatible type exception

decimal类型的计算虽然是无损的,但是decimal在计算过程可能会产生精度位数的变化,导致下图中的问题:计算结果插入结果表中时出现”incompatible type”的错误。

 

image.png

 

4.2 如何避免

问题出现的原因是混用了1.0 decimal类型和2.0 decimal类型。若想有效的避免decimal计算导致的问题,需要遵循:

  • 从建表开始,始终使用同一种数据类型,不要混用。
  • 使用2.0数据类型,建源表和结果表时指定具体的decimal精度位,如decimal(35,6),避免计算中精度位数的变化。

5. 避免转型问题的最佳实践

如果希望避免精度问题,并且在计算过程中避免结果转型,那么可以将所有涉及精确计算的字段在建表时就采用2.0数据类型,并且指定所需要的精度,例如:

set odps.sql.decimal.odps2=true; CREATE TABLE `ods_test` ( ` account_balance` DECIMAL(38, 18) COMMENT '账户余额' )

在后续的查询和计算过程中,设置“odps.sql.decimal.odps2=true”后进行操作,例如:

set odps.sql.decimal.odps2=true; select sum(account_balance) from ods_test

6. 写在最后

本篇主要讨论了计算(数据开发)过程中double类型精度问题,maxcompute在数据集成的过程中会不会产生精度问题?最佳实践是什么?预知后事如何,且听下回分解!

参考文档

[1] https://blog.csdn.net/liliuteng/article/details/8062019
[2] https://cloud.tencent.com/developer/article/1468551
[3] https://blog.csdn.net/lkforce/article/details/81564927
[4] https://www.zhihu.com/question/42024389/answer/93528601
[5] https://help.aliyun.com/product/27797.html?spm=a2c4g.11186623.6.540.615f44f675F7Wi
[6] https://baike.baidu.com/item/IEEE%20754/3869922?fr=aladdin

我们是阿里云智能全球技术服务-SRE团队,我们致力成为一个以技术为基础、面向服务、保障业务系统高可用的工程师团队;提供专业、体系化的SRE服务,帮助广大客户更好地使用云、基于云构建更加稳定可靠的业务系统,提升业务稳定性。

原文链接

本文为阿里云原创内容,未经允许不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162210.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是java?为什么要学Java? 学Java有什么用?

    什么是java?为什么要学Java? 学Java有什么用?肯定会有许多人或多或少都和我一样,当偶然在电视上看到程序员对着电脑飞快敲下一串代码,不禁为他们发出惊叹,想象着有一天自己也能这样。是的,有一天你也能这样!因为我已经实现了!下面我们来看看到底什么是JAVA?为什么要学习,学习了有什么用?先给大家看一下19年计算机语言排行什么是java?为什么要学Java?学Java有什么用?1.什么是JavaJava它就是一种编程语言,别的编程语言能干的事,它都能干。2.编程语言这么多,我为什么选择Java呢?简单易学首先Java是一个面向对象的编程语言

    2022年7月7日
    24
  • SMO算法最通俗易懂的解释

    SMO算法最通俗易懂的解释我的机器学习教程「美团」算法工程师带你入门机器学习已经开始更新了,欢迎大家订阅~任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~SVM通常用对偶问题来求解,这…

    2022年6月30日
    29
  • Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)

    Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)勿以恶小而为之,勿以善小而不为————————–刘备劝诸君,多行善事积福报,莫作恶主要内容有:1,拦截器的配置2权限拦截器

    2022年5月14日
    29
  • dedecsm系统(企业简介)类单栏目模版如何修改和调用整理

    dedecsm系统(企业简介)类单栏目模版如何修改和调用整理

    2021年9月19日
    48
  • C1能力认证训练题解析 _ 第四部分 _ Web进阶「建议收藏」

    C1能力认证训练题解析 _ 第四部分 _ Web进阶「建议收藏」C1见习工程师能力认证训练题_第四部分_Web进阶

    2022年10月20日
    0
  • 学生选课管理系统_学生管理系统的主要内容

    学生选课管理系统_学生管理系统的主要内容文件下载地址:https://download.csdn.net/download/axiebuzhen/108950621.业务描述设计本系统,模拟学生选课的部分管理功能。学生入校注册后需统一记录学生个人基本信息,对于面向学生开设的相关课程需要记录每门课程的基本信息,每个任课教师规定其可主讲三门课程,学生选课时系统将相应的选课信息记录入库,考试结束后需在相应的选课记录中补上考试成绩。简化…

    2022年10月15日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号