[Python] PySpark; DecimalType multiplication precision loss

Discussão em 'Python' iniciado por Stack, Junho 11, 2025.

  1. Stack

    Stack Membro Participativo

    When doing multiplication with PySpark, it seems PySpark is losing precision.

    For example, when multiple two decimals with precision 38,10, it returns 38,6 and rounds to three decimals which is the incorrect result.

    from decimal import Decimal
    from pyspark.sql.types import DecimalType, StructType, StructField

    schema = StructType([StructField("amount", DecimalType(38,10)), StructField("fx", DecimalType(38,10))])
    df = spark.createDataFrame([(Decimal(233.00), Decimal(1.1403218880))], schema=schema)

    df.printSchema()
    df = df.withColumn("amount_usd", df.amount * df.fx)
    df.printSchema()
    df.show()


    Result

    >>> df.printSchema()
    root
    |-- amount: decimal(38,10) (nullable = true)
    |-- fx: decimal(38,10) (nullable = true)
    |-- amount_usd: decimal(38,6) (nullable = true)

    >>> df = df.withColumn("amount_usd", df.amount * df.fx)
    >>> df.printSchema()
    root
    |-- amount: decimal(38,10) (nullable = true)
    |-- fx: decimal(38,10) (nullable = true)
    |-- amount_usd: decimal(38,6) (nullable = true)

    >>> df.show()
    +--------------+------------+----------+
    | amount| fx|amount_usd|
    +--------------+------------+----------+
    |233.0000000000|1.1403218880|265.695000|
    +--------------+------------+----------+



    Is this a bug? Is there a way to get the correct result?

    Continue reading...

Compartilhe esta Página