Округление разницы между десятичными и двойными числами при форматировании с помощью ToString () - PullRequest
4 голосов
/ 07 августа 2020

Я вижу различия в результате при форматировании значений numeri c с использованием ToString("F2").

0.125m.ToString("F2", CultureInfo.InvariantCulture); // 0.13
0.125.ToString("F2", CultureInfo.InvariantCulture); // 0.12

Почему эти значения округляются по-разному?

. NET Fiddle version кода здесь .

1 Ответ

2 голосов
/ 07 августа 2020

Это задокументировано здесь :

Когда спецификатор точности управляет количеством дробных цифр в строке результата, строка результата отражает число, которое округляется до представимого результата, ближайшего к бесконечности точный результат. Если есть два одинаково близких к представлению результата:

  • На. NET Framework и. NET Core до. NET Core 2.0, среда выполнения выбирает результат с большим наименее значимым di git (то есть с использованием MidpointRounding.AwayFromZero).
  • Вкл. NET Core 2.1 и более поздних версий среда выполнения выбирает результат даже с наименьшим значащим di git (то есть с использованием MidpointRounding.ToEven).

Обратите внимание, что double - это тип с плавающей двоичной точкой. Они представлены в двоичной системе (например, 11010.00110). Когда double представлено в десятичной системе, это только приближение, поскольку не все двоичные числа имеют точное представление в десятичной системе.

...