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。