zoukankan      html  css  js  c++  java
  • 【hive】关于浮点数比较的问题

    当在hive中写下浮点数(例如:0.2)

    hive会把浮点数(0.2)存储为double类型

    但是系统中并不能精准表示0.2这个浮点数

    正确的浮点数表示

    float   0.2 —> 0.2000000

    double 0.2 —> 0.200000000000

    但是系统中表示为

    float 0.2 —> 0.2000001

    double 0.2 —> 0.200000000001

    如果我们在hive中把 float(0.2)转化成为double(0.2)

    实际上是 0.2000001 —> 0.200000100000

    并不是 0.2000001 —> 0.200000000001

    所以

    float(0.2)转化的double(0.2) 是大于直接存储的double(0.2)

    float类型和double类型相比较,hive中是自动把范围小的类型转化成为范围大的类型的,也就是float转化为doule

    导致float转化成为的double类型的数字大于比较的double数字

    所以我们在使用浮点数比较的时候,不要用hive的自动扩充精度来比较,尽量使用较小精度来比较.

    也就是float和double比较的时候,把double cast( as float)才能显示正确结果.

    示例:

    TABLE table1

    id (INT) ,taxes(float)

        1              0.2  

        2             0.2   

        3             0.3

    我们要找出大于0.2的id有哪些

    select id,taxes from table1 where taxes > 0.2;

    结果显示:

    1  0.2

    2  0.2

    3  0.3

    为什么会把0.2本身也显示呢?

    因为hive把0.2存储为double类型,

    0.2 —> 0.200000000001

    而taxes为float类型

    id (INT) ,taxes(float) 

        1              0.2          —> 0.2000001

        2             0.2          —> 0.2000001

        3             0.3         —>  0.3000001

    当我们用float类型和double类型比较的时候

    hive自动将taxes转化为double类型

    id (INT) ,taxes(float)  —> taxes(float_to_double)         

        1              0.2        —> 0.200000100000 

        2             0.2        —> 0.200000100000

        3             0.3        —> 0.300000100000

    所以实际上,float(0.2) —> float_to_double(0.2) > double(0.2)

    怎么才能正确显示呢?

    不使用hive的自动扩充精度机制,直接把double减少精度

    也就是double —> float,

    select id,taxes from table1 where taxes > cast(0.2 as float);

    结果:

    3   0.3

  • 相关阅读:
    nginx启动失败
    Windows下载安装docker详细步骤
    Consul
    Idea导入多个maven项目到同一目录下
    使用V-chart时踩过的一些坑
    java集合超详解
    HashMap
    curl和wget的区别和使用
    SourceTree3.2.6版本跳过注册办法
    单点登录
  • 原文地址:https://www.cnblogs.com/zzhangyuhang/p/9778322.html
Copyright © 2011-2022 走看看