PySpark执行除法运算时如何去除结果中的科学计数法
问题场景
对DataFrame两个字段执行除法运算时,计算结果始终以科学计数法格式返回,示例如下:
- 计算逻辑:
636.57 / 1031995.85 - 默认返回结果:
6.168338758338999E-4
当前使用的实现代码:
df.withColumn("value",coalesce(col("value_1"),lit(0))/coalesce(col("value_2"),lit(0)))
尝试使用cast("decimal(18,14)")对计算结果做类型转换后,返回结果仍为科学计数法格式:
6.1683386E-4
预期得到的非科学计数法格式结果为6.168338758338999,参考现有公开方案调整后仍未解决问题,需要可行的实现方法。
可行解决方法
- 方法1:运算前提前转换为高精度Decimal类型(推荐,无精度损失)
不要等浮点数除法计算完成后再做类型转换,要在运算前就将两个参与计算的字段转为足够精度的Decimal类型,从运算阶段规避科学计数法生成,代码示例:
注意Decimal参数设置:精度设为28、小数位标度设为18可以覆盖绝大多数小数运算场景,不会出现精度截断,运算完成后结果会以普通小数格式存储,不会触发科学计数法展示。之前运算后再转Decimal出现结果偏差、仍为科学计数法的问题,本质是浮点数本身的存储精度缺陷导致的。from pyspark.sql.functions import col, coalesce, lit df = df.withColumn( "value", coalesce( col("value_1").cast("decimal(28,18)"), lit(0).cast("decimal(28,18)") ) / coalesce( col("value_2").cast("decimal(28,18)"), lit(0).cast("decimal(28,18)") ) ) - 方法2:格式化固定小数位输出(适合仅做结果展示的场景)
如果计算后的字段不需要参与后续数值运算,可以直接用格式化函数将结果固定小数位输出,彻底规避科学计数法:from pyspark.sql.functions import col, coalesce, lit, printf_format # 若需要保留数值类型,格式化后转回double即可;纯展示场景可直接保留字符串类型 df = df.withColumn( "value", printf_format( "%.15f", coalesce(col("value_1"), lit(0))/coalesce(col("value_2"), lit(0)) ).cast("double") )
内容的提问来源于stack exchange,提问作者Carlos Eduardo Bilar Rodrigues
相关产品推荐
相关产品推荐

