2017-04-12 92 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始终使用相同的计算精度,但不显示尾随零。

因此,它有时只会返回小数点,但是当您使用的数字不适合浮点数集合时,它只会显示小数点直到结束。