select 52 * 20 / 6700000 ; =0.00015522388059701492 select cast(52 as decimal(2,0)) * 20 / 6700000; =0.00015522
为什么使用小数会破坏精度?使用精度更高的小数点,或者将查询的所有成员转换为小数点,结果将只保留8位精度,这是没有帮助的。
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并捕获内部日志以显示返回数据类型。
njthzxwz2#
在处理浮点数时,计算机必须在速度和精度之间找到折衷办法。这在处理非常小或非常大的浮点数时尤其明显。有一个关于语言应该如何处理浮点数的ieee标准,因此错误在某种程度上是“标准化的”。下面是一个有趣的例子,比较多种语言:https://0.30000000000000004.com/当你告诉程序不要把某个数字当作浮点数,而是当作小数,结果会改变,因为它不再符合标准。
2条答案
按热度按时间xu3bshqb1#
在案例1中,hive返回double,因此您看到的精度非常高。decimal类型的范围大约是-10^-308到10^-308。
在案例2中,hive返回十进制(12,8),所以您可以看到这样的结果。
为什么?我不是100%确定,但我认为在案例1中,hive尝试返回默认数据类型,但在案例2中,因为我们使用cast decimal,所以它尝试返回decimal(12,8)。我运行sqls并捕获内部日志以显示返回数据类型。
njthzxwz2#
在处理浮点数时,计算机必须在速度和精度之间找到折衷办法。这在处理非常小或非常大的浮点数时尤其明显。
有一个关于语言应该如何处理浮点数的ieee标准,因此错误在某种程度上是“标准化的”。
下面是一个有趣的例子,比较多种语言:https://0.30000000000000004.com/
当你告诉程序不要把某个数字当作浮点数,而是当作小数,结果会改变,因为它不再符合标准。