當在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