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

本文详细探讨了MaxCompute(ODPS)中double类型在计算时出现的精度问题,以及如何通过转型为decimal类型来解决这一问题。在金融场景下,double的精度不足可能导致微小的误差,而decimal类型则提供了无损计算的方案。然而,直接从double转decimal也可能存在精度损失,尤其是在不同版本的数据类型之间转换。为避免问题,建议从源头建表时就使用decimal并指定精度,确保在整个计算流程中保持同一数据类型,从而保证计算结果的准确性。此外,文章还强调了避免混合使用不同版本的decimal类型以防止异常。
简介: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.0001100110011

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值