有人能解释我以下Hive(0.13)的行为吗?

4jb9z9bj  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(357)
select 52 * 20 / 6700000 ;
=0.00015522388059701492  
select cast(52 as decimal(2,0)) * 20 / 6700000;
=0.00015522

为什么使用小数会破坏精度?使用精度更高的小数点,或者将查询的所有成员转换为小数点,结果将只保留8位精度,这是没有帮助的。

xu3bshqb

xu3bshqb1#

在案例1中,hive返回double,因此您看到的精度非常高。decimal类型的范围大约是-10^-308到10^-308。

select 52 * 20 / 6700000 ;
Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:_c0, type:double, comment:null)], properties:null)

在案例2中,hive返回十进制(12,8),所以您可以看到这样的结果。

select cast(52 as decimal(2,0)) * 20 / 6700000; 
Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:_c0, type:decimal(12,8), comment:null)], properties:null)

为什么?我不是100%确定,但我认为在案例1中,hive尝试返回默认数据类型,但在案例2中,因为我们使用cast decimal,所以它尝试返回decimal(12,8)。我运行sqls并捕获内部日志以显示返回数据类型。

njthzxwz

njthzxwz2#

在处理浮点数时,计算机必须在速度和精度之间找到折衷办法。这在处理非常小或非常大的浮点数时尤其明显。
有一个关于语言应该如何处理浮点数的ieee标准,因此错误在某种程度上是“标准化的”。
下面是一个有趣的例子,比较多种语言:https://0.30000000000000004.com/
当你告诉程序不要把某个数字当作浮点数,而是当作小数,结果会改变,因为它不再符合标准。

相关问题