ROUND関数は、指定した小数点以下の桁数に基づいて入力値を丸めます。 このトピックでは、ROUND関数の精度の問題について説明し、参照用のソリューションと例を提供します。
例:
SQLコードのROUND関数の返された結果は期待どおりではありません。 例:
select round(0.25375,4);返される結果は、ROUND関数のロジックに基づいて0.2538されると予想されます。 ただし、入力値は切り上げられず、0.2537が返されます。
原因
MaxComputeは、関数が実行される前に、関数の入力値をDOUBLE型に変換します。 データ型の変換中に、精度の低下が発生します。 その結果、ROUND関数の返される結果は不正確になります。 この例では、0.25375は0.2536999999に変換されます... その結果、0.2537が返されます。
ROUND関数を使用してテーブル内のデータを処理すると、テーブルフィールドの実際のデータ型が読み取られます。 この場合、精度の問題は発生しません。
解決策
入力値の精度を確保するために、CAST関数を使用して、指定した入力値をDECIMAL型に変換できます。 DECIMALタイプのデータでは、精度の問題は発生しません。 サンプル文:
se t odps.sql.hive.com patible=false; の設定が使用されたときに返される結果:
select round(cast(0.25375 as decimal), 4);返される結果は0.2538です。
select round(cast(0.25375 as decimal(20,5)), 4);返される結果は0.2538です。
se t odps.sql.hive.com patible=true; の設定を使用した場合に返される結果:
select round(cast(0.25375 as decimal), 4);返される結果は0です。
select round(cast(0.25375 as decimal(20,5)), 4);返される結果は0.2538です。