Maksymalna precyzja ciągów formatu liczbowego
Maksymalna precyzja podczas formatowania liczb jako ciągów przy użyciu parametrów ToString
i TryFormat
została zmieniona z Int32.MaxValue na 999 999 999 999. (Maksymalna precyzja została wcześniej zmieniona na Int32.MaxValue w programie .NET 6).
Ponadto maksymalny wykładnik dozwolony podczas analizowania BigInteger ciągu został ograniczony do 999 999 999 999 999 999.
Poprzednie zachowanie
Na platformie .NET 6 standardowa logika analizowania formatu liczbowego była ograniczona do dokładności lub mniejszej Int32.MaxValue . Zamierzonym zachowaniem było zgłoszenie dla dowolnej precyzji większej FormatException niż Int32.MaxValue. Jednak ze względu na usterkę platforma .NET 6 nie zgłosiła tego wyjątku dla niektórych takich danych wejściowych. Zamierzone zachowanie było następujące:
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.
Ponadto podczas analizowania BigInteger elementu z ciągu nie było limitu rozmiaru wykładnika.
Nowe zachowanie
Począwszy od platformy .NET 7, platforma .NET obsługuje precyzję do 999 999 999 999. Wartość A FormatException jest zgłaszana, jeśli precyzja jest większa niż 999 999 999 999. Ta zmiana została zaimplementowana w logice analizowania, która ma wpływ na wszystkie typy liczbowe.
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.
Ponadto, jeśli próbujesz przeanalizować wartość BigInteger z wykładnikiem większym niż 999 999 999 999 999 z ciągu, jest zwracana wartość .FormatException
Wprowadzona wersja
.NET 7
Typ zmiany powodującej niezgodność
Ta zmiana może mieć wpływ na zgodność binarną.
Przyczyna wprowadzenia zmiany
Zachowanie wprowadzone na platformie .NET 6 miało na celu zgłoszenie dla dowolnej precyzji większej FormatException niż Int32.MaxValue. Jednak ze względu na usterkę nie zgłosiła tego wyjątku dla niektórych danych wejściowych większych niż wartość maksymalna. Ta zmiana naprawia usterkę przez ograniczenie dokładności do 999 999 999 999 999.
Zalecana akcja
W większości przypadków nie jest konieczne żadne działanie, ponieważ jest mało prawdopodobne, że używasz już precyzji wyższej niż 999 999 999 999 w ciągach formatu.
Dotyczy interfejsów API
Ta zmiana została zaimplementowana w logice analizowania, która ma wpływ na wszystkie typy liczbowe.
- 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)