Compartilhar 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 um BigInteger de uma 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 estava limitada a uma precisão de Int32.MaxValue ou menos. O comportamento pretendido era gerar um FormatException para qualquer precisão maior 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 era:

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 no tamanho do expoente ao analisar um BigInteger de uma cadeia de caracteres.

Novo comportamento

A partir do .NET 7, o .NET dá suporte à precisão de até 999.999.999. Um FormatException será gerado se a precisão for maior que 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á gerado.

Versão introduzida

.NET 7

Tipo de alteração interruptiva

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

Motivo da alteração

O comportamento introduzido no .NET 6 era destinado a 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 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, pois é improvável que você já esteja usando uma precisão superior a 999.999.999 nas 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.

Confira também