ETL過程中資料精度不準確問題
最近一位同學在使用Restcloud ETL產品做資料整合,出現資料傳輸到目標庫表後,資料精度不準確問題。
場景為:從oracle源表資料 格式為:number(21,6)將資料同步到mysql目標表資料格式為:float(21,6) ; 同步資料 發現 oracle是:538121.47 同步到mysql資料庫中:538121.50,看到這裡,不免有些同學會認為是產品的問題,我們一起來分析下。
首先,我們需要了解下資料在計算機中的區別。在計算機內部,小數有兩種表示方法: 定點數和浮點數 。
1、浮點型(float和double) 浮點型在資料庫中存放的是近似值
MySQL資料型別 含義
float(m,d) 單精度浮點型 8位精度(4位元組) m總個數,d⼩數位
double(m,d) 雙精度浮點型 16位精度(8位元組) m總個數,d⼩數位
設⼀個欄位定義為float(5,3),如果插⼊⼀個數123.45678,實際資料庫⾥存的是123.457,但總個數還以實際為準,即6位。
2、定點數 定點型別在資料庫中存放的是精確值
浮點型在資料庫中存放的是近似值,
⽽定點型別在資料庫中存放的是精確。decimal(m,d) 引數m<65 是總個數,d<30且 d<m 是⼩數位。
對於單精度浮點數Float: 當資料範圍在±131072(65536×2)以內的時候,flo
at資料精度是正確的,但是超出這個範圍的資料就不穩定,沒有發現有相關的引數設定建議:將float改成double或者decimal,兩者的差別是double是浮點計算,decimal是定點計算,會得到更精確的資料。
下面使用分析,
首先建立測試表
CREATE TABLE customer ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(45) DEFAULT NULL, age int(11) DEFAULT NULL, jinqian float(5,2) DEFAULT NULL, PRIMARY KEY (id) );
float(m,d)
m表示的是最大長度,d表示的顯示的小數位數。
例如上面的sql裡:float(5,2) 表示:這個浮點數最大長度為5,也就是五位,然後小數部分為2位,至於儲存範圍,取決於你是否定義了無符號。
無符號的話,最小
是0.0
最大能儲存到99999.9,如果有符號的話,範圍是:-99999.9至99999.9。
預設大小為24位數字,精度大約7位數字(經測試為6位),當設定M大小大於24時,自動轉換為DOUBLE型別;同時設定M和D時不進行自動轉換。
小數位超過設定值,按四舍五入儲存
INSERTINTO customer (id,name,age,jinqian)VALUES(111111111,'uu',15,90.012);
INSERTINTOcustomer(id,name,age,jinqian)VALUES(1111111111,'uu',15,90.018);
上面兩個分別被儲存為
l
總結
從上面的分析,我們可以得出以下結論:
1、浮點數存在誤差問題;
2、對貨幣等對精度敏感的資料,應該用定點數表示或儲存;
3、程式設計中,如果用到浮點數,要特別注意誤差問題,並儘量避免做浮點數比較;
4、要注意浮點數中一些特殊值的處理
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70005218/viewspace-2901932/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iOS --NSDecimalNumber 處理計算精度不準確問題iOSDecimal
- Es資料彙總不準確的問題
- mysql.user表的資料準確性問題MySql
- 透過 ETL 匯出 Hive 中的資料Hive
- 敏捷轉型過程中避不開的4個問題敏捷
- thrift使用過程中的問題
- 爬蟲過程中遇到的問題爬蟲
- JS中浮點數精度問題JS
- Vue資料不渲染問題Vue
- 過擬合詳解:監督學習中不準確的「常識」
- 開發過程中mysql常見問題MySql
- munium學習過程中問題解決
- 學習vue過程中遇到的問題Vue
- 安裝yeoman,grunt過程中的問題
- Mybatis plus 一對多關聯查詢分頁不準確的問題MyBatis
- Elasticsearch 如何保證寫入過程中不丟失資料的Elasticsearch
- setInterval()不準確原因分析
- SAP Commerce Cloud 構建過程中的資料夾可寫入性問題分析Cloud
- 資料標準化遇到的問題
- bcadd 的精度問題?
- JS toFixed 精度問題JS
- Jtti:如何修復Oracle資料庫執行過程的問題JttiOracle資料庫
- 關於ubuntu安裝中過程遇到問題Ubuntu
- 探討系統中?錢的精度問題
- ETL資料整合丨透過ETLCloud工具,將Oracle資料實時同步至Doris中CloudOracle
- 資料準備 ——報表開發中的深層次問題
- 集合 bcadd 的精度問題?
- 前端— toFixed() 的精度問題前端
- 電商APP測試過程中遇到的問題APP
- Mac電腦使用imazing過程中遇到的問題Mac
- Composer 使用過程中遇到的問題和解決方案
- Flutter開發過程中遇到的問題記錄Flutter
- 進行版本迭代過程中,使用spring jpa來完美解決資料表更新的問題Spring
- 【ETL工具】DataX + DataXWeb 初使用過程記錄Web
- JavaScript 中精度問題及解決思路彙總JavaScript
- Restcloud ETl資料通過時間戳實現增量資料同步RESTCloud時間戳
- 資料分析過程中後設資料該如何管理
- 安裝gcc過程中遇到相互依賴的問題GC