You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 21:24:01