将小数转换为整数并找出两列之间的差异

6tr1vspr  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(351)

我有两个专栏,如下所示:

  1. A | B
  2. 0.33 | 0.55
  3. 0.44 | 0.65
  4. 10 | 20
  5. 10.1 | 10.234
  6. 11.236 | 12.8963
  7. 12 | 30
  8. 30.5698| 35.6893

在上述列中,带小数的值应乘以100,以将其转换为整数,并且整数的格式正确,因此不应受到干扰。
使用转换后的整数,计算列之间的差值。
所以我在Hive里尝试了数学函数,比如mod函数。
但是使用这个函数,整数的差是正确的。但是小数的差别是错误的。
我不知道我哪里出错了。
我尝试了以下代码:
从样本中选择mod(b,100)-mod(a,100)
实际结果是:

  1. A | B | C
  2. 0.33 | 0.55 | 22
  3. 0.44 | 0.65 | 21
  4. 10 | 20 | 10
  5. 10.1 | 10.234 | 13
  6. 11.236 | 12.8963| 166
  7. 12 | 30 | 18
  8. 30.5698| 35.6893| 512
im9ewurl

im9ewurl1#

a和b是什么数据类型?如果将它们定义为小数,则所有值都将具有相同的精度:

  1. create table temp.table_name (
  2. A decimal(10,5)
  3. ,B decimal(10,5)
  4. )
  5. stored as parquet location '../temp.db/table_name'
  6. ;
  7. INSERT INTO TABLE temp.table_name
  8. VALUES (0.33 ,0.55)
  9. ,(0.44 ,0.65)
  10. ,(10 ,20)
  11. ,(10.1 ,10.234)
  12. ,(11.236 ,12.8963)
  13. ,(12 ,30)
  14. ,(30.5698,35.6893);

选择的结果(具有相同精度的所有数据):

  1. +---------------+---------------+--+
  2. | table_name.a | table_name.b |
  3. +---------------+---------------+--+
  4. | 0.33000 | 0.55000 |
  5. | 0.44000 | 0.65000 |
  6. | 10.00000 | 20.00000 |
  7. | 10.10000 | 10.23400 |
  8. | 11.23600 | 12.89630 |
  9. | 12.00000 | 30.00000 |
  10. | 30.56980 | 35.68930 |
  11. +---------------+---------------+--+

选择以获取小数点的差值:

  1. select a ,b ,( cast(round((b*100),0) as int) -
  2. cast(round((a*100),0) as int)) as res
  3. from temp.table_name;

结果-小数之差:

  1. +-----------+-----------+-------+--+
  2. | a | b | res |
  3. +-----------+-----------+-------+--+
  4. | 0.33000 | 0.55000 | 22 |
  5. | 0.44000 | 0.65000 | 21 |
  6. | 10.00000 | 20.00000 | 1000 |
  7. | 10.10000 | 10.23400 | 13 |
  8. | 11.23600 | 12.89630 | 166 |
  9. | 12.00000 | 30.00000 | 1800 |
  10. | 30.56980 | 35.68930 | 512 |
  11. +-----------+-----------+-------+--+

希望能对你有所帮助。

展开查看全部

相关问题