日志服务 统计分析(SQL)结果小数位数不正确

这篇说说腾讯云日志服务SQL中除法运算结果小数位数异常的两个现象及解决方法:整数除法导致小数丢失,需将整数转为小数;double类型后续运算会破坏精度,应在最终结果统一保留小数位数。 整数除法丢失小数:整数间除法结果仍为整数,需用100.0或cast函数转为小数再运算。 double精度问题:round后仍为double,后续运算会破坏精度,应在最终结果统一保留小数位数。

相关产品
日志服务 产品页,含版本规格、价格与购买入口。

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

赞 (0)
上一篇 5天前
下一篇 5天前