Databricks如何不四舍五入截断小数 解决truncate函数未定义报错
Databricks数值小数位不四舍五入截断解决方案
报错原因
Databricks SQL 中的truncate函数不支持数值类型的小数截断操作,它仅用于两种场景:
- 清空表数据:
TRUNCATE TABLE 表名 - 日期时间类型截断:配合
date_trunc函数实现日期按年/月/日等维度截断
直接调用truncate(数值, 小数位)会触发函数未定义的报错。
实现方法
方法1:floor结合乘除运算(通用方案,全版本支持)
通过放大N倍后取整再缩小N倍的逻辑实现截断,语法如下:
-- 保留2位小数截断示例 SELECT floor(12.455555 * 100) / 100 AS truncated_value;
返回结果为12.45,完全无四舍五入。
如果需要兼容负数场景(截断后向0靠近,而非向下取整),可以优化写法:
-- 负数兼容示例,保留2位小数 SELECT sign(-12.455555) * floor(abs(-12.455555) * 100) / 100 AS truncated_value;
返回结果为-12.45,符合常规截断需求。
如果需要动态调整保留的小数位,可以替换固定的100为pow(10, 保留位数):
-- 动态保留3位小数示例 SELECT floor(12.455555 * pow(10, 3)) / pow(10, 3) AS truncated_value;
方法2:字符串正则匹配(特殊场景使用)
如果是非数值计算的展示场景,也可以转字符串后截取,性能略低于数值运算:
SELECT regexp_extract(CAST(12.455555 AS STRING), '^\\d+\\.\\d{2}', 0) AS truncated_value;
返回结果为字符串类型的12.45,需要数值类型可以再套一层CAST转数值。
方法3:官方trunc函数(高版本支持)
如果你使用的是Databricks Runtime 13.0及以上版本,可以直接调用原生数值截断函数trunc:
SELECT trunc(12.455555, 2) AS truncated_value;
直接返回12.45,无需自行实现逻辑。
内容的提问来源于stack exchange,提问作者user10009190
相关产品推荐
相关产品推荐

