ROUND函数精度问题案例

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。