为什么.NET Core Convert.ToInt32 对奇数进行四舍五入
Why does .NET Core Convert.ToInt32 round up odd numbers
我刚刚通读了一些 .NET Core 代码,并试图了解 System.Convert.ToInt32(float n) 如何发挥其魔力。
让我有点恼火的是,如果数字是奇数且 >= 0.5,则决定四舍五入。
if (value < 2147483647.5)
{
int result = (int)value;
double dif = value - result;
if (dif > 0.5 || dif == 0.5 && (result & 1) != 0) result++;
return result;
}
奇怪检查的原因是什么?
一个构建合理但在整个应用程序中传播的场景 1.5 可能等于 2.5。
// True
Convert.ToInt32(1.5) == Convert.ToInt32(2.5)
它被称为四舍五入到偶数,是一种以公平方式四舍五入数字的方法。它也称为 收敛舍入、统计学家舍入、荷兰式舍入、高斯舍入、奇偶舍入或银行家舍入。
Round half to even: A tie-breaking rule without positive/negative bias and without bias toward/away from zero is round half to even. This function minimizes the expected error when summing over rounded figures, even when the inputs are mostly positive or mostly negative. It is the default rounding mode used in IEEE 754 floating-point operations.
参见:
我刚刚通读了一些 .NET Core 代码,并试图了解 System.Convert.ToInt32(float n) 如何发挥其魔力。
让我有点恼火的是,如果数字是奇数且 >= 0.5,则决定四舍五入。
if (value < 2147483647.5)
{
int result = (int)value;
double dif = value - result;
if (dif > 0.5 || dif == 0.5 && (result & 1) != 0) result++;
return result;
}
奇怪检查的原因是什么? 一个构建合理但在整个应用程序中传播的场景 1.5 可能等于 2.5。
// True
Convert.ToInt32(1.5) == Convert.ToInt32(2.5)
它被称为四舍五入到偶数,是一种以公平方式四舍五入数字的方法。它也称为 收敛舍入、统计学家舍入、荷兰式舍入、高斯舍入、奇偶舍入或银行家舍入。
Round half to even: A tie-breaking rule without positive/negative bias and without bias toward/away from zero is round half to even. This function minimizes the expected error when summing over rounded figures, even when the inputs are mostly positive or mostly negative. It is the default rounding mode used in IEEE 754 floating-point operations.
参见: