如何计算彩票号码销售百分比并对计算结果进行取整处理?
彩票销售占比计算的代码修正方案
原代码核心问题
- 计算逻辑完全偏差:原代码采用的
(totalNumbers / 100) * totalSellings公式,和“计算已售号码占总规模百分比”的目标完全不匹配。以总号码规模10000为例,公式计算时会先算出10000/100=100,再乘以已售号码数,最终结果被无端放大100倍——比如已售12个号码时,原代码输出1200,实际正确占比仅为0.12%。 - 整数截断精度问题:即使修正公式,如果直接使用两个int类型做除法,C#会默认执行整数截断,直接丢弃小数部分。比如
12 / 10000的整数计算结果为0,后续乘100也永远无法得到正确的百分比值。
正确实现逻辑
销售占比的核心计算公式为:销售占比 =(已售号码数 / 可供销售总号码数) 100*。实现时需要先规避整数截断导致的精度丢失,再根据业务需求完成取整,同时处理总号码数为0的边界场景,避免触发除零异常。
参考修正代码如下:
IList<NumbersLottery> allNumbers = context.AllNumbers.Where(n => n.concurso.id == concurso.id).ToList(); int totalNumbers = allNumbers.Count; // 总号码规模10000 int totalSellings = allNumbers.Where(n => n.status == NumbersLotteryStatus.SELL).ToList().Count; // 边界判断:避免总号码数为0时触发除零异常 if (totalNumbers == 0) { Debug.WriteLine("Percents Sell: 0"); return; } // 强制转为double类型计算,避免整数除法截断丢失精度 double sellPercent = (double)totalSellings / totalNumbers * 100; // 按业务需求选择适配的取整规则: // 1. 四舍五入取整(常规统计场景最常用) int PercentSells = (int)Math.Round(sellPercent, MidpointRounding.AwayFromZero); // 2. 向下取整(直接丢弃小数部分,适用于保守统计场景) // int PercentSells = (int)Math.Floor(sellPercent); // 3. 向上取整(存在小数就向上进1,适用于进度预估类场景) // int PercentSells = (int)Math.Ceiling(sellPercent); Debug.WriteLine("Percents Sell: " + PercentSells);
效果校验
以总号码10000个、已售1200个的场景为例,修正后计算得到的销售占比为12%,取整后输出12,符合百分比的常规认知,不会出现原代码输出1200的逻辑偏差。
内容的提问来源于stack exchange,提问作者FernandoPaiva
相关产品推荐
相关产品推荐

