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

PySpark使用SQL AGGREGATE函数转float对数组求和结果异常

PySpark数组求和偏差原因分析

核心原因

该问题是单精度浮点数(float)的固有精度限制导致的计算舍入误差,和PySpark本身的逻辑无关,属于通用的浮点数精度问题。


具体原因拆解

  1. 先确认正确求和结果:
    两个数组的手动计算和均为:
v1求和:24005 + 24806874 + 114187 = 24945066
v2求和:24005 + 24806872 + 114189 = 24945066

两个数组的实际和完全一致。
2. 单精度float的精度限制:
32位单精度浮点数的尾数长度为23位,对应的整数精确表示上限为2^24 = 16777216,所有大于这个值的整数都无法被float精确表示,会被自动舍入到最近的可表示浮点值。
本次计算中涉及的数值24806874已经远大于16777216,转成float时就已经出现了精度损失。
3. 累加过程的精度丢失:
你将累加初始值设为cast(0 as float),整个聚合计算过程都会以float类型执行:数组中的Long类型元素会先被转成float,再和累加器相加,整个过程多次发生舍入,最终结果就和真实值出现了偏差。
4. 替换为double后结果正确的原因:
64位双精度浮点数的尾数长度为52位,对应的整数精确表示上限为2^53 ≈ 9e15,本次计算的所有数值(包括最终和24945066)都远小于这个阈值,所有整数都可以被double精确表示,累加过程不会出现舍入误差,因此可以得到正确结果。


内容的提问来源于stack exchange,提问作者Christie Summers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:06:04