有奖捉虫:行业应用 & 管理与支持文档专题 HOT
文档中心 > 日志服务 > 常见问题 > 检索分析相关 > 统计分析(SQL)结果小数位数不正确

现象1:未保留小数位数,仅有整数部分

使用类似如下的检索分析语句时,期望能够保留小数点两位数,但结果只有整数部分:
检索分析语句:
* | select count_if(status>=400)*100/count(*) as "错误日志百分比"
结果:
0
即便使用 round 函数 指定需要保留的小数点位数,结果仍然只有整数部分:
检索分析语句:
* | select round(count_if(status>=400)*100/count(*),2) as "错误日志百分比"
结果:
0

原因

SQL 中,整数(bigint)之间进行除法运算时,结果仍为整数,对整数使用 round 函数也是无效的。

解决办法

方法1:
在四则运算中,使用乘法将其中一个整数(bigint)转换为小数(double),例如:
* | select round(count_if(status>=400)*100.0/count(*),2) as "错误日志百分比"
方法2:
使用 类型转换函数 将其中一个整数(bigint)转换为小数(double),例如:
* | select round(cast(count_if(status>=400)*100 as double)/count(*),2) as "错误日志百分比"

现象2:小数位数保留不正确

使用类似如下的检索分析语句时,期望能够最终保留小数点2位数,但结果保留了14位数:
检索分析语句:
* | select round(count_if(status>=400)*1.0/count(*),5)*100 as "错误日志百分比"
结果:
99.99900000000001

原因

count_if(status>=400)*1.0/count(*)的结果类型为 double,使用 round 函数后结果仍为 double,再进行运算时不能再保证小数位数的正确性。

解决方法

将所有的运算进行完毕后,最终再统一保留小数位数,例如:
* | select round(count_if(status>=400)*100.0/count(*),3) as "错误日志百分比"
?


http://www.vxiaotou.com