Почему .NET Core Convert.ToInt32 округляет нечетные числа - PullRequest
0 голосов
/ 29 января 2019

Я только что прочитал код .NET Core и попытался понять, как System.Convert.ToInt32 (с плавающей точкой) делает свое дело.

Что меня немного раздражает, так это решение округлить, если число нечетное и> = 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)

1 Ответ

0 голосов
/ 29 января 2019

Он называется Округление от половины до четного и является одним из способов округления чисел справедливым образом.Это также называется сходящимся округлением, округлением статистики, округлением Голландии, округлением Гаусса, округлением нечетно-четным или округлением банкиров.1009 * Правило разрыва связи без положительного / отрицательного смещения и без смещения в направлении / от нуля является круглым от половины до четного.Эта функция минимизирует ожидаемую ошибку при суммировании по округленным цифрам, даже когда входные данные в основном положительные или в основном отрицательные.Это режим округления по умолчанию, используемый в операциях с плавающей запятой IEEE 754.

См .:

...