不同数据类型数组计算NRR,double数组始终显示0.0000000求排查
解决NRR输出始终为0.0000000的问题
嘿,这个问题我太熟悉了——十有八九是整数除法在搞鬼!咱们一步步拆解原因和修复方法:
核心问题:整数除法导致精度丢失
当你用两个int类型的值做除法时,大多数编程语言(比如C、C++、Java)会执行整数除法:直接舍弃小数部分,只保留整数结果。
举个例子:如果你的NRR计算公式是(总得分差) / (总局数差),假设某支球队得分差是3,局数差是5——3/5用整数除法算出来是0,再把这个0赋值给double类型的NRR数组元素,自然就显示成0.0000000了。哪怕得分差是负数,比如-2/5,整数除法结果还是0,同样会导致NRR为0。
修复方法:强制触发浮点除法
只要把除法操作中的任意一个操作数强制转换成double类型,就能让编译器执行浮点除法,保留小数部分。比如:
错误写法(整数除法)
// 结果是整数除法的结果,再转成double还是0 NRR[i] = (totalRunsFor[i] - totalRunsAgainst[i]) / (totalOversFor[i] - totalOversAgainst[i]);
正确写法(浮点除法)
可以把分子强制转成double:
NRR[i] = (double)(totalRunsFor[i] - totalRunsAgainst[i]) / (totalOversFor[i] - totalOversAgainst[i]);
或者把分母强制转成double:
NRR[i] = (totalRunsFor[i] - totalRunsAgainst[i]) / (double)(totalOversFor[i] - totalOversAgainst[i]);
额外注意:避免除以0的情况
别忘记处理除数为0的场景(比如某支球队还没进行任何比赛,或者总局数差为0),否则会导致程序崩溃。可以加个判断:
int oversDiff = totalOversFor[i] - totalOversAgainst[i]; if (oversDiff != 0) { NRR[i] = (double)(totalRunsFor[i] - totalRunsAgainst[i]) / oversDiff; } else { NRR[i] = 0.0; // 或者根据赛事规则设置合适的默认值 }
内容的提问来源于stack exchange,提问作者Rohan Jayaraj
相关产品推荐
相关产品推荐

