首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >踩坑经验 | Hive除法小数位问题

踩坑经验 | Hive除法小数位问题

作者头像
做数据的二号姬
发布2025-09-04 11:04:55
发布2025-09-04 11:04:55
13900
代码可运行
举报
运行总次数:0
代码可运行

图片由夸克AI绘制

最近在写一个Hive SQL的时候遇到了除法结果不对的问题。大概就是sum(a)/sum(b)明明不等于0但是SQL返回的结果是0的问题。

这个问题对我来说真的是第一次遇到,老司机们对此的评价是:你没有系统学过编程。

因为 Hive 的表达式计算遵循 Java 的整数除法规则,在 Java 中,两个整数相除结果还是整数, Hive 的行为和Java一致。

在 Java/Hive 中,/ 运算符的行为取决于操作数的类型:如果两个操作数都是 int、long 等整数类型,执行的是整数除法,结果会被截断;如果其中至少一个操作数是 float 或 double,则执行的是浮点除法,保留小数部分。

因此这个问题有两种解法,一个解法是给分子或者分母乘上一个浮点数让小数点能够正常显示,另一个解法是在除法之前先对数据格式进行调整:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT
  SUM(a) AS sum_a,
  SUM(b) AS sum_b,
  SUM(a) * 1.0 / SUM(b) AS ratio
FROM your_table;

“整数除法截断”并不是 Hive/Java 的专利,而是一种历史沿袭下来的“C 家族”语义——只要两个操作数都是整数类型,除法结果就向 0 截断(truncate toward zero)。目前主流语言里,只要没有显式浮点参与,就极有可能掉进这个坑里面。

C/Java/C++/Go/Rust/Kotlin/Scala/Python2等语言都有这个问题,不过也好记,只要这门语言把“/”同时用于整数和浮点,就大概率会采用 C 语义:整数÷整数→向 0 截断。想要避免,要么把其中一个操作数变成浮点,要么用专门的“真除法”运算符。

又是有用的知识增加的一天。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 做数据的二号姬 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档