Partilhar via


Precisão máxima para cadeias de caracteres de formato numérico

A precisão máxima ao formatar números como cadeias de caracteres usando ToString e TryFormat foi alterada de Int32.MaxValue para 999 999 999. (A precisão máxima foi alterada anteriormente para Int32.MaxValue no .NET 6.)

Além disso, o expoente máximo permitido ao analisar uma BigInteger cadeia de caracteres foi limitado a 999.999.999.

Comportamento anterior

No .NET 6, a lógica de análise de formato numérico padrão era limitada a uma precisão igual Int32.MaxValue ou inferior. O comportamento pretendido era lançar um FormatException para qualquer precisão maior do que Int32.MaxValue. No entanto, devido a um bug, o .NET 6 não lançou essa exceção para algumas dessas entradas. O comportamento pretendido foi:

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.

Além disso, não havia limite para o tamanho do expoente ao analisar um BigInteger a partir de uma cadeia de caracteres.

Novo comportamento

A partir do .NET 7, o .NET oferece suporte à precisão de até 999.999.999. Um FormatException é lançado se a precisão for superior a 999.999.999. Essa alteração foi implementada na lógica de análise que afeta todos os 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.

Além disso, se você tentar analisar um BigInteger com um expoente maior que 999.999.999 de uma cadeia de caracteres, um FormatException será lançado.

Versão introduzida

.NET 7

Tipo de mudança disruptiva

Essa alteração pode afetar a compatibilidade binária.

Motivo da mudança

O comportamento introduzido no .NET 6 visava lançar um FormatException para qualquer precisão maior que Int32.MaxValue. No entanto, devido a um bug, ele não lançou essa exceção para algumas entradas maiores do que o máximo. Essa alteração corrige o bug limitando a precisão a 999.999.999.

Na maioria dos casos, nenhuma ação é necessária, porque é improvável que você já esteja usando uma precisão superior a 999.999.999 em suas cadeias de caracteres de formato.

APIs afetadas

Essa alteração foi implementada na lógica de análise que afeta todos os tipos numéricos.

Ver também