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.
Ação recomendada
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.
- System.Numerics.BigInteger.ToString(String)
- System.Numerics.BigInteger.ToString(String, IFormatProvider)
- System.Numerics.BigInteger.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Int32.ToString(String)
- System.Int32.ToString(String, IFormatProvider)
- System.Int32.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt32.ToString(String)
- System.UInt32.ToString(String, IFormatProvider)
- System.UInt32.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Byte.ToString(String)
- System.Byte.ToString(String, IFormatProvider)
- System.Byte.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.SByte.ToString(String)
- System.SByte.ToString(String, IFormatProvider)
- System.SByte.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Int16.ToString(String)
- System.Int16.ToString(String, IFormatProvider)
- System.Int16.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt16.ToString(String)
- System.UInt16.ToString(String, IFormatProvider)
- System.UInt16.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Numerics.BigInteger.Parse
- System.Numerics.BigInteger.TryParse
- System.Int64.ToString(String)
- System.Int64.ToString(String, IFormatProvider)
- System.Int64.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.UInt64.ToString(String)
- System.UInt64.ToString(String, IFormatProvider)
- System.UInt64.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Half.ToString(String)
- System.Half.ToString(String, IFormatProvider)
- System.Half.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Single.ToString(String)
- System.Single.ToString(String, IFormatProvider)
- System.Single.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Double.ToString(String)
- System.Double.ToString(String, IFormatProvider)
- System.Double.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
- System.Decimal.ToString(String)
- System.Decimal.ToString(String, IFormatProvider)
- System.Decimal.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de