Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Максимальная точность при форматировании чисел в виде строк с помощью 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
Это изменение было реализовано в логике синтаксического анализа, которая влияет на все числовые типы.
- System.Numerics.BigInteger.ToString(String)
- System.Numerics.BigInteger.ToString(String, IFormatProvider)
- System.Numerics.BigInteger.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Int32.ToString(String)
- System.Int32.ToString(String, IFormatProvider)
- System.Int32.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt32.ToString(String)
- System.UInt32.ToString(String, IFormatProvider)
- System.UInt32.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Byte.ToString(String)
- System.Byte.ToString(String, IFormatProvider)
- System.Byte.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.SByte.ToString(String)
- System.SByte.ToString(String, IFormatProvider)
- System.SByte.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Int16.ToString(String)
- System.Int16.ToString(String, IFormatProvider)
- System.Int16.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt16.ToString(String)
- System.UInt16.ToString(String, IFormatProvider)
- System.UInt16.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Numerics.BigInteger.Parse
- System.Numerics.BigInteger.TryParse
- System.Int64.ToString(String)
- System.Int64.ToString(String, IFormatProvider)
- System.Int64.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt64.ToString(String)
- System.UInt64.ToString(String, IFormatProvider)
- System.UInt64.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Half.ToString(String)
- System.Half.ToString(String, IFormatProvider)
- System.Half.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Single.ToString(String)
- System.Single.ToString(String, IFormatProvider)
- System.Single.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Double.ToString(String)
- System.Double.ToString(String, IFormatProvider)
- System.Double.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Decimal.ToString(String)
- System.Decimal.ToString(String, IFormatProvider)
- System.Decimal.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
См. также
- Стандартный числовой формат анализа изменения точности (.NET 6)
- Стандартные строки числового формата
- Символьные литералы в строках пользовательского формата