Maximale precisie voor tekenreeksen met numerieke notatie

De maximale precisie voor het formatteren van getallen als tekenreeksen met behulp van ToString en TryFormat is veranderd van Int32.MaxValue naar 999.999.999. (De maximale nauwkeurigheid is in het verleden gewijzigd naar Int32.MaxValue in .NET 6.)

Bovendien is de maximale exponent die is toegestaan bij het parseren van een BigInteger tekenreeks beperkt tot 999.999.999.999.

Vorig gedrag

In .NET 6 was de standaardlogica voor het parseren van numerieke notatie beperkt tot een precisie van Int32.MaxValue of minder. Het beoogde gedrag was om een FormatException op te werpen bij elke precisie die groter is dan Int32.MaxValue. Vanwege een fout heeft .NET 6 die uitzondering echter niet gegenereerd voor sommige dergelijke invoer. Het beoogde gedrag was:

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.

Daarnaast was er geen limiet voor de exponentgrootte bij het parseren van een BigInteger tekenreeks.

Nieuw gedrag

Vanaf .NET 7 ondersteunt .NET precisie tot 999.999.999.999. A FormatException wordt gegenereerd als de precisie groter is dan 999.999.999. Deze wijziging is geïmplementeerd in de parseringslogica die van invloed is op alle numerieke typen.

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.

Bovendien, als u een BigInteger met een exponent groter dan 999.999.999 uit een tekenreeks probeert te parseren, wordt er een FormatException gegenereerd.

Geïntroduceerde versie

.NET 7

Type van brekende verandering

Deze wijziging kan van invloed zijn op binaire compatibiliteit.

Reden voor wijziging

Het gedrag dat in .NET 6 is geïntroduceerd, was bedoeld om een FormatException te genereren voor elke precisie die groter is dan Int32.MaxValue. Vanwege een bug wierp het echter die uitzondering niet voor enkele invoerwaarden die groter zijn dan het maximum. Met deze wijziging wordt de fout opgelost door de precisie te beperken tot 999.999.999.

In de meeste gevallen is er geen actie nodig, omdat het onwaarschijnlijk is dat u al een precisie gebruikt die hoger is dan 999.999.999 in uw notatietekenreeksen.

Betreffende API's

Deze wijziging is geïmplementeerd in de parseringslogica die van invloed is op alle numerieke typen.

Zie ook