如何在Spark中关闭数值舍入,转换DecimalType时截取小数点后四位不进位
解决方案
核心思路是通过数值运算直接截断小数位,避开类型转换或格式化函数的默认舍入逻辑,PySpark实现代码如下:
from pyspark.sql.functions import floor, lit from pyspark.sql.types import DataTypes # 计算逻辑:放大10000倍后向下取整,再缩小回原数量级,最后转换为目标Decimal类型 df = dataframe.withColumn("test", (floor(lit(0.4219759403) * 10000) / 10000).cast(DataTypes.createDecimalType(20,4)) )
实现原理
- 先将待处理数值乘以
10000,把需要保留的4位小数转到整数位,示例中0.4219759403 * 10000 = 4219.759403 - 调用
floor函数向下取整,直接抹除剩余小数部分,得到整数4219 - 除以
10000得到截断后的数值0.4219,此时再转换为DecimalType(20,4)不会触发舍入,完全符合预期
如果需要兼容负数的截断需求,可以用分支逻辑分别处理正负值:
from pyspark.sql.functions import when, ceil, col df = dataframe.withColumn("test", when(col("raw_num") >= 0, floor(col("raw_num") * 10000) / 10000 ).otherwise(ceil(col("raw_num") * 10000) / 10000 ).cast(DataTypes.createDecimalType(20,4)) )
内容的提问来源于stack exchange,提问作者Sinka
相关产品推荐
相关产品推荐

