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.
Acción recomendada
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.
- 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)
Vea también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de