【MaxCompute学习】隐式转化的问题

简介: MaxCompute使用小技巧

有一次计算一个数据的百分比,想把小数结果取2位,并拼接一个百分号展示在结果报表中。用到的sql如下

select concat(round(10230/1497409,4)*100,'%') from  dual;

很奇怪局部数据并没有保留2位小数,比如上面的数据返回的是67.99999999999999

我计算了下上面的结果大概得到的数据为0.0068

select concat(round(0.0066 ,4)*100,'%') from  dual;--0.66%
select concat(round(0.0067 ,4)*100,'%') from  dual;--0.67%
select concat(round(0.0068 ,4)*100,'%') from  dual;--0.6799999999999999%
select concat(round(0.0069 ,4)*100,'%') from  dual;--0.69%

由于计算值采用了concat函数,concat的多个参数为string类型,如果输入为bigint,decimal,double,datetime类型会隐式转化为string类型,并且返回的为string类型

也就是说有两种情况

1.round函数返回的数字cast为string后就丢失了精度。 2.round函数返回的数字就丢失了精度。

select round(0.0066 ,4)*100 from dual; --0.66
select round(0.0067 ,4)*100 from dual; --0.67
select round(0.0068 ,4)*100 from dual; --0.6799999999999999
select round(0.0069 ,4)*100 from dual; --0.69

上面的结果说明是round函数返回的数字就丢失了精度。

round函数是用来计算指定到小数点位数的四舍五入的值的,如果其第一个参数为double类型,那么函数计算的结果就是double类型,如果其第一个参数为Decimal类型,那么函数计算的结果就是decimal类型的,如果其第一个参数为string类型或者bigint类型,那么就会隐式转化为double类型。

单独计算round的返回值如下,说明double类型的round返回值为double

select round(0.0068 ,4) from dual; --0.0068

再计算乘法的结果,double和bigint相计算的时候也是会发生隐式转化的

select 0.0066*100 from dual;--0.66
select 0.0067*100 from dual;--0.67
select 0.0068*100 from dual;--0.6799999999999999
select 0.0069*100 from dual;--0.69

对于操作符号的运算,string,bigint和double都可以参与算术运算,string类型会转成double类型计算 当bigint和bigint进行除法运算的时候结果会返回double类型,当bigint和double共同计算的时候,big今天会转成doule类型,并且返回结果为double类型,

那么100变成了double类型,这时候问题就有点眉目了

select cast(0.0068 as double) from dual;--0.0068
select cast(100 as double) from dual;--100.0
select 0.0068*100.0 from dual;--0.6799999999999999

double浮点数运算的时候会有丢失精度的问题,这个是所有的浮点数运算的通病,我们可以再java下验证一下

public class TestDouble {
    public static void main(String args[]){
        Double a=0.0068;
        Double b=100.0;

        System.out.println(a*b);//0.6799999999999999

        Double c=0.0067;
        Double d=100.0;

        System.out.println(c*d);//0.67

        BigDecimal e= new BigDecimal(0.0068);
        BigDecimal f=new BigDecimal(100.0);

        System.out.println(e.multiply(f));//0.679999999999999962113639284666533058043569326400756835937500

        BigDecimal g= new BigDecimal(Double.toString(0.0068));
        BigDecimal h=new BigDecimal(Double.toString(100.0));

        System.out.println(g.multiply(h));//0.68000
    }
}

当然这个问题的最终解决方案很简单,不过以后再计算对精度要求比较高的数据的时候建议还是设计成decimal类型

select round(10230*100/1497409,4) from  dual;


文章转载自wangming

欢迎加入“数加·MaxCompute购买咨询”钉钉群(群号: 11782920)进行咨询,群二维码如下:

96e17df884ab556dc002c912fa736ef6558cbb51
相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
6月前
|
SQL 资源调度 数据库
数仓学习---14、大数据技术之DolphinScheduler
数仓学习---14、大数据技术之DolphinScheduler
|
7月前
|
分布式计算 Hadoop 大数据
Hadoop学习:深入解析MapReduce的大数据魔力之数据压缩(四)
Hadoop学习:深入解析MapReduce的大数据魔力之数据压缩(四)
|
7月前
|
分布式计算 资源调度 Hadoop
Hadoop学习指南:探索大数据时代的重要组成——Hadoop运行模式(下)
Hadoop学习指南:探索大数据时代的重要组成——Hadoop运行模式(下)
|
7月前
|
存储 数据采集 机器学习/深度学习
大数据学习的一些概念(值得背)
大数据学习的一些概念(值得背)
|
7月前
|
分布式计算 Hadoop 大数据
Hadoop学习:深入解析MapReduce的大数据魔力(三)
Hadoop学习:深入解析MapReduce的大数据魔力(三)
|
6月前
|
SQL NoSQL Java
Redis学习---大数据技术之Redis(NoSQL简介、Redis简介、Redis安装、五大数据类型、相关配置、持久化)
Redis学习---大数据技术之Redis(NoSQL简介、Redis简介、Redis安装、五大数据类型、相关配置、持久化)
|
6月前
|
人工智能 搜索推荐 数据可视化
电子学习中的大数据分析:每个人都应该知道的这些方面
电子学习中的大数据分析:每个人都应该知道的这些方面
|
1月前
|
存储 SQL 关系型数据库
【MySQL 数据库】6、一篇文章学习【索引知识】,提高大数据量的查询效率【文末送书】
【MySQL 数据库】6、一篇文章学习【索引知识】,提高大数据量的查询效率【文末送书】
56 0
|
7月前
|
存储 分布式计算 Hadoop
Hadoop学习:深入解析MapReduce的大数据魔力(二)
Hadoop学习:深入解析MapReduce的大数据魔力(二)
|
7月前
|
存储 分布式计算 Hadoop
Hadoop学习指南:探索大数据时代的重要组成——HDFS(上)
Hadoop学习指南:探索大数据时代的重要组成——HDFS(上)

相关产品

  • 云原生大数据计算服务 MaxCompute