【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

posted @ 2018-10-12 15:22  zzhangyuhang  阅读(3137)  评论(0编辑  收藏  举报