PySpark中如何将Double值四舍五入后正确转换为Integer类型?
解决PySpark中保留两位小数后四舍五入取整的问题
我完全懂你的困扰——PySpark里直接把double类型的列转成integer确实只会粗暴截断小数部分,哪怕你已经用round处理过两位小数。别担心,有几种简单可靠的方法能实现你要的四舍五入取整效果:
方法一:二次Round后转Integer(最通用)
既然你已经得到了保留两位小数的col4,只需要再对col4执行一次round(保留0位小数),然后转成integer类型即可。这个方法能完美处理正负数值,符合常规的四舍五入逻辑:
from pyspark.sql import functions as F # 生成四舍五入后的整数列col5 df = df.withColumn("col5", F.round(F.col("col4"), 0).cast("integer"))
示例效果
假设你的原始数据是:
| col3 | col4 |
|---|---|
| 123.446 | 123.45 |
| 123.495 | 123.50 |
| 99.991 | 99.99 |
| -123.495 | -123.50 |
处理后col5的结果:
| col5 |
|---|
| 123 |
| 124 |
| 100 |
| -124 |
方法二:用表达式直接转换(适合SQL风格)
如果你习惯用SQL表达式,也可以直接写一行完成:
df = df.withColumn("col5", F.expr("CAST(ROUND(col4, 0) AS INT)"))
效果和方法一完全一致,只是写法更贴近SQL语法。
为什么直接Cast不行?
PySpark的cast("integer")对浮点数采用截断取整逻辑:不管小数部分是0.1还是0.999,都会直接舍弃小数部分,只保留整数位。比如123.999直接转integer会得到123,而不是你期望的124。所以必须先通过round把浮点数调整到最接近的整数,再执行类型转换。
内容的提问来源于stack exchange,提问作者User12345
相关产品推荐
相关产品推荐

