S05003

错误代码

S05003

报错信息

DECIMAL math overflow RefId:S05003

错误原因

DECIMAL 类型数据的内部实则使用有符号整型进行存储,详细如下:

  • DECIMAL32 使用 int32_t 表示。
  • DECIMAL64 使用 int64_t 表示。
  • DECIMAL128 使用 int128_t 表示。

对于 N bits 格式的有符号整型数据,其可以表示的数值范围为 [-1 * 2 ^ (N-1), 2 ^ (N-1) - 1]。如果 DECIMAL 内部的整型数据在参与运算时,其结果超出该可表示范围,就会报这个错误。比如:

  • DECIMAL 数据参与计算(计算函数,SQL);
  • 将其他类型的数据转换成 DECIMAL;
  • 不同 DECIMAL 类型、不同 scale 的 DECIMAL 数据相互转换。

解决办法

  1. 使用可表示范围更大的 DECIMAL 类型,比如 DECIMAL128。
  2. 适当降低 DECIMAL 的参数 scale。比如,若数据只需要精确到小数点后 5 位,那么建议将 scale 调整为 5。
  3. 使用 FLOAT/DOUBLE 替换 DECIMAL 类型。