2017-04-12 74 views
2

我一直在蜂巢工作,發現一些奇特的東西。基本上,在使用double作爲列的數據類型時,我們不需要指定任何精度(hive根據值動態獲取精度)。但是,這是問題。每當我的值是2和7小數點後我看到返回值也改變了精度位置的數量。蜂巢 - 雙精度

讓我明確一點,用我的簡單例子。

hive> select cast('34.2234' + '32.6554' -3.1 as double); 
OK 
63.7788 
Time Taken 0.077 seconds, Fetched: 1 row(s) 

當我在小數點後使用1(3.1中減1)時,我可以看到結果似乎很好。但是,當3.2或3.7,給出了減法,我看到下面的變化

在使用3.2

hive> select cast('34.2234' + '32.6554' -3.2 as double); 
OK 
63.678799999999995 
Time Taken 0.077 seconds, Fetched: 1 row(s) 

在使用3.7

hive> select cast('34.2234' + '32.6554' -3.7 as double); 
OK 
63.178799999999995 
Time Taken 0.077 seconds, Fetched: 1 row(s) 

雖然結果似乎是正確的,爲什麼是在這種情況下精度得到改變。當我們使用小數點前的任何值並且在它之後只有2或7時(如4.2,4.7,3.2,2.7等),它是相同的。它與2和7相比有什麼特別之處,它將精度改爲15個值,爲什麼不將其他值更改爲15。

+0

你爲什麼要對字符串進行算術運算? –

+0

'double'數據類型以科學記數法存儲,可能會損失精度。使用'十進制' –

+0

@DuduMarkovitz這只是一個示例。這是相同的,即使我試着用數字 –

回答

0

我想你是計算精度與顯示小數混淆。

Hive始終使用相同的計算精度,但不顯示尾隨零。

因此,它有時只會返回小數點,但是當您使用的數字不適合浮點數集合時,它只會顯示小數點直到結束。