
# 数据迁移时，源端数据库与目的端数据库中的Double、Float等浮点类型数据为什么存在精度差异？
#### 问题描述
数据集成离线作业中，进行数据迁移时，源端数据库与目的端数据库中的Double、Float等浮点类型数据存在精度差异。
#### 原因分析
该问题源于不同数据库系统对浮点类型底层实现机制及精度定义的差异，并非数据集成服务本身存在数据丢失或错误。
具体原因如下：
1. 浮点类型的本质是非精确。 Float（单精度）、Double（双精度）等类型属于非精确数值类型。它们在计算机中的存储遵循IEEE 754标准，采用二进制表示十进制小数。许多十进制小数（如0.1）无法被二进制精确表达，因此在存储和计算时必然存在极小精度误差。
   - REAL/FLOAT4：单精度浮点数，通常支持6位十进制数字精度。
   
   - DOUBLE PRECISION/FLOAT8：双精度浮点数，通常支持15位十进制数字精度。
    
2. 不同数据源的精度定义差异。 不同的数据库厂商对浮点类型的默认精度、舍入规则及显示位数有不同的实现，源端数据库与目的端数据库可能采用不同的浮点数处理机制。
   
 
#### 解决方案
如高精度科学计算数据、金融测算数据等数据要求严格的场景下，推荐使用Decimal等能够指定精度的数据类型进行数据迁移，避免存在精度差异。
#### 案例说明
MYSQL Double类型迁移到DataArts Fabric数据源，在数据极端的情况下，精度可能存在误差。
图1示例一   
![](https://support.huaweicloud.com/dataartsstudio_faq/zh-cn_image_0000002561798363.png "点击放大")
图2示例二   
![](https://support.huaweicloud.com/dataartsstudio_faq/zh-cn_image_0000002530798470.png "点击放大")
