我一直在研究 hive ,发现了一些奇怪的东西。基本上,当使用 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 个值,为什么不更改为其他值。
最佳答案
这是浮点运算的样子
hive> select 1.1 + 0.1;
OK
1.2000000000000002
DOUBLE (8-byte double precision floating point number
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types
如果您想要准确/可预测的东西,请使用 decimal
hive> select cast (1.1 as decimal(12,2)) + cast (0.1 as decimal(12,2));
OK
1.2
关于hadoop - hive - double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43362996/