Précision maximale pour les chaînes de format numérique

La précision maximale lors de la mise en forme des nombres sous forme de chaînes à l’aide de ToString et TryFormat a été modifiée de Int32.MaxValue à 999 999 999. (La précision maximale a été précédemment changée en Int32.MaxValue dans .NET 6.)

En outre, l’exposant maximal autorisé lors de l’analyse d’un BigInteger à partir d’une chaîne a été limité à 999 999 999.

Comportement précédent

Dans .NET 6, la logique d’analyse de format numérique standard était limitée à une précision de Int32.MaxValue ou moins. Le comportement prévu était de lever FormatException pour toute précision supérieure à Int32.MaxValue. Toutefois, en raison d’un bogue, .NET 6 ne levait pas cette exception pour certaines entrées de ce type. Le comportement prévu était le suivant :

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.

En outre, la taille de l’exposant n’était pas limitée lors de l’analyse d’un BigInteger à partir d’une chaîne.

Nouveau comportement

À compter de .NET 7, .NET prend en charge la précision jusqu’à 999 999 999. Une exception FormatException est levée si la précision est supérieure à 999 999 999. Cette modification a été implémentée dans la logique d’analyse qui affecte tous les types numériques.

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.

En outre, si vous essayez d’analyser un BigInteger avec un exposant supérieur à 999 999 999 à partir d’une chaîne, une exception FormatException est levée.

Version introduite

.NET 7

Type de changement cassant

Ce changement peut affecter la compatibilité binaire.

Raison de la modification

Le comportement introduit dans .NET 6 était destiné à lever FormatException pour toute précision supérieure à Int32.MaxValue. Toutefois, en raison d’un bogue, cette exception n’était pas levée pour certaines entrées supérieures à la valeur maximale. Cette modification corrige le bogue en limitant la précision à 999 999 999.

Dans la plupart des cas, aucune action n’est nécessaire, car il est peu probable que vous utilisiez déjà une précision supérieure à 999 999 999 dans vos chaînes de format.

API affectées

Cette modification a été implémentée dans la logique d’analyse qui affecte tous les types numériques.

Voir aussi