【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM