如何在KQL中实现无舍入的两位小数精度输出?
KQL实现无舍入保留两位小数并补零的高效方案
问题需求
需要在KQL中输出无舍入、固定两位小数的数值:
- 避免
round()函数的四舍五入行为,仅截断多余小数位 - 满足补零场景:如数值1需输出
1.00,2.8需输出2.80 - 替代CPU开销大的字符串拼接/截取方案,寻求更高效的实现方式
已尝试的方案
方案1:decimal类型字符串拼接
datatable(mydecimal:decimal) [ 0.32000000000000006, 1.6384000000000003, 3.768320000000001, 0.65536000000000028 ] | project orignalvalue=mydecimal, roundvalue=round(mydecimal,2), requiredValue=strcat(strcat_array(array_slice(split(mydecimal,'.'),0,0),'.'),'.',substring(strcat_array(array_slice(split(mydecimal,'.'),-1,1),''),0,2))
方案2:real类型字符串截取
datatable(mydecimal:real) [ 0.32000000000000006, 1.6384000000000003, 3.768320000000001, 0.65536000000000028 ] | extend requiredValue=substring(tostring(mydecimal), 0, indexof(tostring(mydecimal),'.')+3) | project orignalvalue=mydecimal, roundvalue=round(mydecimal,2), requiredValue;
方案3:补零尝试(逻辑复杂)
datatable(mydecimal:decimal) [ 0.32000000000000006, 1.6384000000000003, 3.768320000000001, 0.65536000000000028, 1, 1.0, 1.1, 1.10, 500.55 ] | extend roundvalue=round(mydecimal,2) | extend result = floor(mydecimal*100, 1) / 100 | extend result01 = case(strlen(substring(tostring(result),indexof(tostring(mydecimal),'.'),3))==1, strcat(tostring(result),'.','00'), strlen(substring(tostring(result),indexof(tostring(mydecimal),'.'),3))==2, strcat(tostring(result),'0'), strlen(substring(tostring(result),indexof(tostring(mydecimal),'.'),3))==3, tostring(result), '') | project orignalvalue=mydecimal, roundvalue, result, result01
优化方案
采用数学截断+内置格式化函数的组合,兼顾性能与需求:
datatable(mydecimal:decimal) [ 0.32000000000000006, 1.6384000000000003, 3.768320000000001, 0.65536000000000028, 1, 1.0, 1.1, 1.10, 500.55 ] | extend truncated_value = floor(mydecimal * 100) / 100 // 数学方式截断到两位小数,无舍入 | extend requiredValue = format_number(truncated_value, "0.00") // 自动补零,固定两位小数格式 | project original_value=mydecimal, round_value=round(mydecimal,2), truncated_value, requiredValue
方案说明
截断逻辑:
floor(mydecimal * 100) / 100- 将数值放大100倍后用
floor()向下取整(实现截断,而非四舍五入),再缩小100倍,得到仅保留两位小数的数值 - 纯数学运算,比字符串操作性能提升显著
- 将数值放大100倍后用
补零格式化:
format_number(truncated_value, "0.00")- KQL内置的格式化函数,通过格式字符串
"0.00"强制保留两位小数,自动补零 - 代码简洁,无需复杂的字符串判断与拼接
- KQL内置的格式化函数,通过格式字符串
内容的提问来源于stack exchange,提问作者Brahmaiah Takkellapati
相关产品推荐
相关产品推荐

