全部產品
Search
文件中心

MaxCompute:ROUND函數精度問題案例

更新時間:Jun 19, 2024

ROUND函數支援根據您指定的小數位元對輸入的數值進行四捨五入。本文為您介紹ROUND函數在使用過程存在的精度問題,並提供解決措施及樣本供參考。

案例

在SQL代碼中使用ROUND函數進行四捨五入時,返回結果與預期的四捨五入結果有偏差。命令樣本如下。

select round(0.25375,4);

按照函數的邏輯實現,返回結果應該為0.2538,但實際返回結果為0.2537,未進位。

產生原因

對於手工輸入的數值,MaxCompute會自動將數值轉換為DOUBLE類型,因為轉換DOUBLE類型數值時無法保證精度,所以ROUND函數處理結果會產生偏差。案例中的0.25375的DOUBLE類型表示結果為0.2536999999...,所以未進位。

當通過ROUND函數處理表中的資料時,會讀取到表欄位的實際資料類型,不會存在此問題。

解決措施

如果需要保證手工輸入資料的精度,可以通過CAST函數將手工輸入的資料轉換為DECIMAL類型,DECIMAL類型不會存在精度問題。命令樣本如下。

set odps.sql.hive.compatible=false;時:
  • select round(cast(0.25375 as decimal), 4);
    返回結果為0.2538。
  • select round(cast(0.25375 as decimal(20,5)), 4);
    返回結果為0.2538。
set odps.sql.hive.compatible=true; 時:
  • select round(cast(0.25375 as decimal), 4);
    返回結果為0。
  • select round(cast(0.25375 as decimal(20,5)), 4);
    返回結果為0.2538。