为什么 .NET Core Convert.ToInt32 四舍五入奇数

Why does .NET Core Convert.ToInt32 round up odd numbers

提问人:Michael Kargl 提问时间:1/29/2019 更新时间:1/30/2019 访问量:128

问:

我刚刚阅读了一些 .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)
C# .NET 核心 点精度

答:

3赞 Michael Kargl 1/30/2019 #1

它被称为四舍五入到偶数,是以公平方式对数字进行四舍五入的一种方式。它也被称为收敛舍入、统计学家舍入、荷兰舍入、高斯舍入、奇偶舍入或银行家舍入。

四舍五入到偶数:没有正/负偏差且没有偏向/远离零的平局规则是整数到偶数。此函数在对四舍五入的数字求和时将预期误差降至最低,即使输入大部分为正数或大部分为负数也是如此。它是 IEEE 754 浮点运算中使用的默认舍入模式。

看: