诀窍在于双精度的表示方式,因此 (1.0/a) 将以下列方式表示:
(1.0/a) = 24999.99999999999636202119290828704833984375。
当你使用 cast 时,你只会得到这个数字的第一部分,而 convert 方法以不同的方式工作,这里是 Convert 方法的代码:
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"));
}
正如您所看到的,有一个 if 语句检查强制转换值和原始双精度之间的差异,在您的示例中它是:
int num = (int)value;
double num2 = value - (double)num;
24999.99999999999636202119290828704833984375 - 24999 > 0.5
,因此你得到增量。