Максимальная точность для строк числового формата

Максимальная точность при форматировании чисел в виде строк с помощью ToString и TryFormat была изменена с Int32.MaxValue на 999 999 999. (Максимальная точность ранее была изменена на Int32.MaxValue .NET 6.)

Кроме того, максимально допустимое экспонентное значение при синтаксическом анализе BigInteger строки ограничено 999 999 999 999.

Предыдущее поведение

В .NET 6 логика синтаксического анализа стандартного числового формата была ограничена точностью Int32.MaxValue или меньше. Предполагаемое поведение заключалось в выбрасывании FormatException для любой точности, превышающей Int32.MaxValue. Однако из-за ошибки .NET 6 не создает это исключение для некоторых таких входных данных. Предполагаемое поведение было следующим:

double d = 123.0;

d.ToString("E" + int.MaxValue.ToString()); // Doesn't throw.

long intMaxPlus1 = (long)int.MaxValue + 1;
string intMaxPlus1String = intMaxPlus1.ToString();
Assert.Throws<FormatException>(() => d.ToString("E" + intMaxPlus1String)); // Throws.

Кроме того, при синтаксическом анализе BigInteger из строки не было ограничения на экспонентный размер.

Новое поведение

Начиная с .NET 7, .NET поддерживает точность до 999 999 999 999. Возникает FormatException, если точность превышает 999 999 999. Это изменение было реализовано в логике синтаксического анализа, которая влияет на все числовые типы.

double d = 123.0;
Assert.Throws<FormatException>(() => d.ToString("E" + int.MaxValue.ToString())); // Throws.

long intMaxPlus1 = (long)int.MaxValue + 1;
string intMaxPlus1String = intMaxPlus1.ToString();
Assert.Throws<FormatException>(() => d.ToString("E" + intMaxPlus1String)); // Throws.

d.ToString("E999999999"); // Doesn't throw.

d.ToString("E00000999999999"); // Doesn't throw.

Кроме того, если вы пытаетесь проанализировать объект BigInteger с экспонентом больше 999 999 999 из строки, выбрасывается исключение FormatException.

Представленная версия

.NET 7

Тип разрушающего изменения

Это изменение может повлиять на совместимость двоичных файлов.

Причина изменения

Поведение, введенное в .NET 6, предусматривало выбрасывание FormatException для любой точности большей, чем Int32.MaxValue. Однако из-за ошибки исключение не возникало для некоторых входных данных, превышающих максимальное значение. Это изменение исправляет ошибку путем ограничения точности до 999 999 999 999.

В большинстве случаев никаких действий не требуется, так как вряд ли вы уже используете точность выше 999 999 999 в строках формата.

Затронутые API

Это изменение было реализовано в логике синтаксического анализа, которая влияет на все числовые типы.

См. также