すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:ROUND関数の精度の問題を修正

最終更新日:Jan 20, 2025

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です。