一、现象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 "错误日志百分比"