Freigeben über


Maximale Genauigkeit für numerische Formatzeichenfolgen

Die maximale Genauigkeit beim Formatieren von Zahlen als Zeichenfolgen mit ToString und TryFormat wurde von Int32.MaxValue in 999.999.999 geändert. (Die maximale Genauigkeit wurde zuvor in Int32.MaxValue in .NET 6 geändert.)

Darüber hinaus wurde der maximal zulässige Exponent beim Analysieren eines BigInteger-Werts aus einer Zeichenfolge auf 999.999.999 beschränkt.

Vorheriges Verhalten

In .NET 6 war die Analyselogik für numerische Standardformate auf eine Genauigkeit von Int32.MaxValue oder weniger beschränkt. Das beabsichtigte Verhalten bestand im Auslösen einer FormatException für eine beliebige Genauigkeit, die größer als Int32.MaxValue ist. Aufgrund eines Fehlers hat .NET 6 diese Ausnahme für einige solche Eingaben jedoch nicht ausgelöst. Das beabsichtigte Verhalten war wie folgt:

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.

Darüber hinaus gab es keine Begrenzung für die Exponentengröße, wenn ein BigInteger-Wert aus einer Zeichenfolge analysiert wurde.

Neues Verhalten

Ab .NET 7 unterstützt .NET Genauigkeit bis 999.999.999. Eine FormatException wird ausgelöst, wenn die Genauigkeit größer als 999.999.999 ist. Diese Änderung wurde in der Analyselogik implementiert, die alle numerischen Typen betrifft.

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.

Wenn Sie versuchen, eine BigInteger mit einem Exponenten größer als 999.999.999 aus einer Zeichenfolge zu analysieren, wird außerdem ein FormatException ausgelöst.

Eingeführt in Version

.NET 7

Typ des Breaking Changes

Diese Änderung kann sich auf die binäre Kompatibilität auswirken.

Grund für die Änderung

Mit dem Verhalten, das in .NET 6 eingeführt wurde, sollte eine FormatException für eine beliebige Genauigkeit größer als Int32.MaxValue ausgelöst werden. Aufgrund eines Fehlers wurde diese Ausnahme jedoch nicht für einige Eingaben ausgelöst, die größer als der Maximalwert waren. Diese Änderung behebt den Fehler, indem die Genauigkeit auf 999.999.999 begrenzt wird.

In den meisten Fällen ist keine Aktion erforderlich, da es unwahrscheinlich ist, dass Sie bereits eine Genauigkeit in Ihren Formatzeichenfolgen verwenden, die höher als 999.999.999 ist.

Betroffene APIs

Diese Änderung wurde in der Analyselogik implementiert, die alle numerischen Typen betrifft.

Siehe auch