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

ADF Copy Data活动复制数据时出现第14位小数数值不匹配问题

问题根因

该偏差出现在Excel文件解析环节,和SQL Server目标端写入逻辑无关——测试中用Copy Data直接把xlsx转CSV输出仍存在相同偏差,已经可以排除目标库的影响。
xlsx格式默认以IEEE 754双精度浮点数(Double类型)存储数值类单元格内容,这类二进制浮点数本身无法精确表示所有十进制小数,有效精度约为15~17位有效数字。Copy Data活动内置的Excel解析引擎在读取数值类单元格时,会先将单元格内容解析为Double类型,再执行后续的类型转换、写入操作;部分十进制小数转换为Double后存储的二进制值和原始值存在微小误差,当误差刚好达到第14位小数的进位阈值时,转字符串输出时就会出现最后一位小数四舍五入进位的情况,比如观测到的1.12345678901234变为1.12345678901235。
这类偏差只会出现在特定值上:只有转Double后误差刚好触达进位阈值的十进制值才会出现该问题,其余能被Double精确表示、或误差未到进位阈值的值不会出现偏差;同时Double类型的存储值是固定的,因此同一个值无论加载多少次都会稳定复现相同偏差,不存在随机性。

可行解决/规避方案
  • 源端格式调整:打开源xlsx文件,将存在精度要求的小数列单元格格式设置为文本格式后再保存数值。此时Copy Data解析单元格时会直接读取原始文本内容,不会触发浮点数解析转换逻辑,从根源上避免精度误差,写入nvarchar列的值会和源文件显示内容完全一致。
  • 复制活动配置调整:在Copy Data活动的源数据集配置中,关闭数值类型自动推断,手动将目标小数列的映射类型从默认的Double修改为String,强制引擎按文本模式读取单元格内容,跳过浮点数转换步骤。
  • 前置文件转换:不要使用Copy Data内置的xlsx转CSV能力(该流程底层仍会先走浮点数解析逻辑,无法规避误差),提前手动在Excel中将源文件另存为带双引号文本限定符的UTF-8编码CSV文件,再通过Copy Data读取CSV文件写入目标表。纯文本格式的CSV不存在数值类型解析逻辑,不会触发浮点数转换误差。
  • 转换逻辑修正:如果无法修改源文件、也不能调整源读取配置,可以在复制活动的数据流中添加派生列步骤,对读取到的Double类型数值使用formatNumber()函数强制格式化为固定14位小数的字符串,截断浮点数带来的尾部进位误差后,再写入nvarchar类型的目标列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:03:20