1

みなさんこんにちは。

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 であってはいけませんか?

4

2 に答える 2

3

Math.Round が犯人です

int AverLI = (int)Math.Round((double)AveragLI);

これは、バンカーの丸めまたは丸めと呼ばれるものです。

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 に丸められます。

これを読む

回避するには、これを行います

int AverLI = (int)Math.Ceiling((double)AveragLI);
于 2013-05-04T01:22:53.887 に答える
2

のデフォルトの丸めスキームMath.Round、銀行家の丸め (金融および統計分野の標準) と呼ばれるもので、中間値が最も近い偶数に丸められます。中間値がゼロから四捨五入されることを期待していたようです (これはおそらく小学校で教えられた種類です: 5 で終わる場合は切り上げます)。

許容できる方法で動作していないことを心配している場合でも、心配しないでください。ゼロから四捨五入したい場合は、次のようにします。

int AverLI = (int)Math.Round((double)AveragLI, MidpointRounding.AwayFromZero);
于 2013-05-04T01:43:01.160 に答える