将小数转换为整数并找出两列之间的差异
Posted
技术标签:
【中文标题】将小数转换为整数并找出两列之间的差异【英文标题】:Convert decimals into whole numbers and finding the difference between two columns 【发布时间】:2019-06-17 11:54:33 【问题描述】:我有如下两列:
A | B
0.33 | 0.55
0.44 | 0.65
10 | 20
10.1 | 10.234
11.236 | 12.8963
12 | 30
30.5698| 35.6893
在上面的列中,带小数的值应乘以 100 以将其转换为整数,并且整数不应受到干扰,因为它们的格式正确。
使用转换后的整数,计算列的差异。
所以我尝试了hive中的数学函数说MOD函数。
但是使用这个函数,整数的差是正确的。但是小数的差是错误的。
我不知道我哪里错了。
我尝试了以下代码:
从样本中选择 mod(B,100)-mod(A,100)
实际结果是:
A | B | C
0.33 | 0.55 | 22
0.44 | 0.65 | 21
10 | 20 | 10
10.1 | 10.234 | 13
11.236 | 12.8963| 166
12 | 30 | 18
30.5698| 35.6893| 512
【问题讨论】:
请同时添加想要的结果 我已经提到它说实际结果是: 【参考方案1】:A 和 B 是什么数据类型? 如果将它们定义为小数,则所有值将具有相同的精度:
create table temp.table_name (
A decimal(10,5)
,B decimal(10,5)
)
stored as parquet location '../temp.db/table_name'
;
INSERT INTO TABLE temp.table_name
VALUES (0.33 ,0.55)
,(0.44 ,0.65)
,(10 ,20)
,(10.1 ,10.234)
,(11.236 ,12.8963)
,(12 ,30)
,(30.5698,35.6893);
选择结果(所有数据精度相同):
+---------------+---------------+--+
| table_name.a | table_name.b |
+---------------+---------------+--+
| 0.33000 | 0.55000 |
| 0.44000 | 0.65000 |
| 10.00000 | 20.00000 |
| 10.10000 | 10.23400 |
| 11.23600 | 12.89630 |
| 12.00000 | 30.00000 |
| 30.56980 | 35.68930 |
+---------------+---------------+--+
选择以获取小数的差异:
select a ,b ,( cast(round((b*100),0) as int) -
cast(round((a*100),0) as int)) as res
from temp.table_name;
结果 - 小数的差异:
+-----------+-----------+-------+--+
| a | b | res |
+-----------+-----------+-------+--+
| 0.33000 | 0.55000 | 22 |
| 0.44000 | 0.65000 | 21 |
| 10.00000 | 20.00000 | 1000 |
| 10.10000 | 10.23400 | 13 |
| 11.23600 | 12.89630 | 166 |
| 12.00000 | 30.00000 | 1800 |
| 30.56980 | 35.68930 | 512 |
+-----------+-----------+-------+--+
希望对您有所帮助。
【讨论】:
以上是关于将小数转换为整数并找出两列之间的差异的主要内容,如果未能解决你的问题,请参考以下文章