Oracle SQL特定规则自定义小数舍入逻辑实现咨询
解决Oracle SQL中的自定义小数舍入问题
嘿,我明白你要实现的这个舍入规则了——把小数部分0.01-0.05统一变成0.05,0.06-0.09变成0.10,整数部分保持不变对吧?其实有两种简洁的实现方式,我给你详细说说:
方法一:用数学公式(推荐,简洁高效)
这个方法利用CEIL函数向上取整的特性,通过简单的乘除运算就能完美匹配你的规则,代码非常简洁:
SELECT original_value, CEIL(original_value * 20) / 20 AS rounded_value FROM your_table;
原理说明:
- 把原数值乘以20:这样0.01变成0.2,0.05变成1,0.06变成1.2,0.09变成1.8
- 用
CEIL取向上取整:0.2取整为1,1取整为1,1.2取整为2,1.8取整为2 - 再除以20:1/20=0.05,2/20=0.10,刚好完全符合你的规则
验证示例:
| original_value | rounded_value |
|---|---|
| 1.01 | 1.05 |
| 1.05 | 1.05 |
| 1.06 | 1.10 |
| 1.09 | 1.10 |
| 2.00 | 2.00 |
方法二:用CASE表达式(更直观,适合复杂规则扩展)
如果你需要更清晰地看到逻辑分支,或者以后要扩展规则,用CASE表达式会更直观易懂:
SELECT original_value, TRUNC(original_value) + CASE WHEN MOD(original_value, 1) BETWEEN 0.01 AND 0.05 THEN 0.05 WHEN MOD(original_value, 1) BETWEEN 0.06 AND 0.09 THEN 0.10 ELSE MOD(original_value, 1) -- 小数部分为0时保持原样 END AS rounded_value FROM your_table;
原理说明:
TRUNC(original_value)获取数值的整数部分(比如1.03的整数部分是1)MOD(original_value, 1)提取小数部分(比如1.03的小数部分是0.03)- CASE语句根据小数部分的区间,加上对应的目标值即可
注意事项
如果你的业务需要处理负数,上述方法需要调整:
- 对于负数,若要实现类似规则(比如-1.03舍入为-1.05,-1.06舍入为-1.10),可以把
CEIL换成FLOOR:SELECT original_value, FLOOR(original_value * 20) / 20 AS rounded_value FROM your_table;
内容的提问来源于stack exchange,提问作者dimas
相关产品推荐
相关产品推荐

