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 になり、より直感的に見えます。
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 になり、より直感的に見えます。
その動作が必要な場合は、 を使用Math.Roundして指定する必要がありますMidpointRounding.AwayFromZero。
例えば:
int result = (int)Math.Round(4.5, MidpointRounding.AwayFromZero);
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"));
}