Helo everyone。
int[] ai1=new int[2] { 3514,3515 };
void average1()
{
List<int> aveList = new List<int> { ai1[0],ai1[1]};
double AveragLI = aveList.Average();
int AverLI = (int)Math.Round((double)AveragLI);
label1.Text = AverLI.ToString();
}
返回3514;不应该是3515?
答案 0 :(得分:3)
Math.Round是罪魁祸首
int AverLI = (int)Math.Round((double)AveragLI);
我们称之为Banker的Rounding甚至四舍五入。
Math.Round的信息说
The integer nearest a. If the fractional component of a is halfway between two integers, one of which is even and the other odd, then the even number is returned.
3514.5四舍五入为3514,3515.5也四舍五入为3514。
阅读this
要避免这样做
int AverLI = (int)Math.Ceiling((double)AveragLI);
答案 1 :(得分:2)
rounding scheme的默认Math.Round
就是所谓的银行家舍入(这是财务和统计区域的标准),其中中点值四舍五入到最接近的偶数。看起来你期望中点数值从零开始(这可能是你在小学就读的那种:如果它以5结尾,那么就是圆形)。
如果您只是担心它不能以可接受的方式工作,请不要担心。如果你希望它从零开始,你可以这样做:
int AverLI = (int)Math.Round((double)AveragLI, MidpointRounding.AwayFromZero);