21

msdn のドキュメントを見ると、次のようConvert.ToInt32()に記載されています。

値が 2 つの整数の中間にある場合、偶数が返されます。つまり、4.5 は 4 に変換され、5.5 は 6 に変換されます。

http://msdn.microsoft.com/en-us/library/ffdk7eyz.aspx

どうしてこれなの?

確かに、最も近い整数に四捨五入する方がより論理的ですよね? もしそうなら、4.5 は 5 になり、5.5 は 6 になり、より直感的に見えます。

4

4 に答える 4

2

その動作が必要な場合は、 を使用Math.Roundして指定する必要がありますMidpointRounding.AwayFromZero

例えば:

int result = (int)Math.Round(4.5, MidpointRounding.AwayFromZero);

デモ: http://ideone.com/ZAbBL

Convert.ToInt32(double)はそれ自体を使用しませんMath.Round。代わりに、この方法で実装されています (ILSpy):

public static int ToInt32(double value)
{
    if (value >= 0.0)
    {
        if (value < 2147483647.5)
        {
            int num = (int)value;
            double num2 = value - (double)num;
            if (num2 > 0.5 || (num2 == 0.5 && (num & 1) != 0))
            {
                num++;
            }
            return num;
        }
    }
    else
    {
        if (value >= -2147483648.5)
        {
            int num3 = (int)value;
            double num4 = value - (double)num3;
            if (num4 < -0.5 || (num4 == -0.5 && (num3 & 1) != 0))
            {
                num3--;
            }
            return num3;
        }
    }
    throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
}
于 2012-07-11T11:43:20.543 に答える