C# - (int)Math.Round((double)(3514 + 3515)/ 2)= 3514?

时间:2013-05-04 01:21:07

标签: c# arrays math average rounding

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?

2 个答案:

答案 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);