Precisión máxima de las cadenas con formato numérico

Al aplicar formato a números como cadenas mediante ToString y TryFormat, la precisión máxima ha cambiado de Int32.MaxValue a 999 999 999 (la precisión máxima ya cambió anteriormente a Int32.MaxValue en .NET 6).

Además, el exponente máximo permitido al analizar un objeto BigInteger de una cadena se ha limitado a 999 999 999.

Comportamiento anterior

En .NET 6, la lógica de análisis del formato numérico estándar se estaba limitada a una precisión de Int32.MaxValue o menos. El comportamiento previsto era producir una excepción FormatException ante cualquier precisión superior a Int32.MaxValue. Sin embargo, debido a un error, .NET 6 no producía esa excepción en algunas de estas entradas. El comportamiento previsto era el siguiente:

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.

Además, no había ningún límite en el tamaño del exponente al analizar un objeto BigInteger de una cadena.

Comportamiento nuevo

A partir de .NET 7, .NET admite una precisión de hasta 999 999 999. S la precisión supera esa cifra, se produce una excepción FormatException. Este cambio se implementó en la lógica de análisis que afecta a todos los tipos numéricos.

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.

Además, si se intenta analizar un objeto BigInteger con un exponente mayor que 999 999 999 de una cadena, se produce una excepción FormatException.

Versión introducida

.NET 7

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad binaria.

Motivo del cambio

El comportamiento que se incluía en .NET 6 estaba diseñado para producir una excepción FormatException ante cualquier precisión superior a Int32.MaxValue. Sin embargo, debido a un error, esa excepción no se producía en algunas entradas que superaban el límite máximo. Este cambio corrige el error, ya que limita la precisión a 999 999 999.

En la mayoría de los casos no es necesario realizar ninguna acción, ya que es bastante improbable que ya se esté usando una precisión superior a 999 999 999 en las cadenas de formato.

API afectadas

Este cambio se implementó en la lógica de análisis que afecta a todos los tipos numéricos.

Vea también