• 【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

  • 相关阅读:
    arcgis 图幅结合图表工具
    Geoprocessor clip
    Spring Boot总结,核心功能,优缺点
    代码下载python 简体和繁体的转换
    电话错误fmxl Missing handler script
    nullnull使用ps绘制像word里面的箭头
    nullnulljava把过滤掉的 % 号拿回来
    问题总结两天来两场实习面试(中科创达、华为)
    模板拷贝【便利贴】Struts性能优化
    匹配优先级Spring攻略学习笔记(3.04)指定Aspect优先级
  • 原文地址:https://www.cnblogs.com/zzhangyuhang/p/9778322.html
Copyright © 2020-2023  润新知