Compartir a través de


Preguntas más frecuentes sobre tipos numéricos

Preguntas más frecuentes sobre clases numéricas, incluidas System.Int16, System.Int32, System.Int64, System.Single, System.Double, System.Decimal, System.Byte, System.SByte, System.UInt16, System.UInt32, System.UInt64, System.IntPtr y System.Math.

¿Por qué no funciona Double.Parse(Double.MaxValue.ToString())?
¿Es compatible .NET Framework con números grandes?
¿Es compatible .NET Framework con números complejos?
¿Por qué ha cambiado Decimal.ToString entre V1.0 y V1.1 y qué puedo hacer para que no me afecte este cambio?

Nos encanta conocer sus ideas, problemas o peticiones. Quizás esté interesado en saber por qué se ha diseñado algo de una manera en particular, la mejor manera de solucionar un problema o los motivos por los que el código que ha creado no funciona como esperaba. Además, puede enviar al equipo de BCL sus sugerencias para versiones futuras de Framework, como clases adicionales que incluir (siempre es útil describir los escenarios que necesita admitir) o API nuevas para clases existentes.

Para enviar su pregunta, simplemente envíe un correo electrónico a The BCL Team (bclpub@microsoft.com).


¿Por qué no funciona Double.Parse(Double.MaxValue.ToString())?
System.Double y System.Single tienen precisión inexacta de dígitos decimales, ya que internamente son números binarios en punto flotante. Así, más allá de un cierto número de dígitos significativos, su representación decimal se vuelve aproximada. Por consiguiente, no se garantiza que Double.ToString() y Single.ToString() completen la ida y la vuelta al mismo valor si se llama a Parse o TryParse.

Existe una opción de formato r, de manera que Double.ToString(r) dará como resultado una representación decimal para completar la ida y la vuelta al mismo valor, que puede ser lo requerido. Esta llamada es más lenta debido al trabajo extra necesario para tener en cuenta las aproximaciones que se realizan durante el análisis.

El motivo por el que Double no puede analizar los valores máximos y mínimos, al contrario que Single, es que Double redondea en una dirección tal que los valores máximos y mínimos completan la ida y la vuelta en un número ligeramente alejado de 0 (por lo tanto, un número que no puede adaptarse a un Double). Single redondea al contrario.

Los ingenieros de otros componentes que intentan probar el intervalo del dominio completo de otro tipo que toma un Double se encuentran con este problema frecuentemente. Este comportamiento es molesto, por lo que se está considerando una solicitud de característica para el tratamiento especial de la forma del texto de los valores máximos y mínimos durante el análisis.


¿Es compatible .NET Framework con números grandes?
Por número grande se entiende cualquier número con un nivel de precisión ilimitado o, a niveles prácticos, uno limitado sólo por la cantidad de memoria disponible.

La clase Decimal es lo más parecido a un número grande en .NET Framework, en V1.0 y V1.1. Es compatible con 96 bits de precisión y 16 bits de ajuste de escala.

No hay un tipo de número grande en V1.0 o V1.1, ni compatibilidad anunciada en las versiones preliminares de Visual Studio 2005 (Whidbey). Existe un gran interés razonable en este tipo, así que es probable que aparezca en futuras versiones, lo que no es poco trabajo.


¿Es compatible .NET Framework con números complejos?
Las versiones 1.0, 1.1 y la siguiente versión de Visual Studio 2005 (Whidbey) no tienen un tipo de número complejo ni operaciones de números complejos.

En una versión futura, .NET Framework ofrecerá compatibilidad en este sentido, aunque la mayoría de usuarios que requieren tal compatibilidad también necesitan otras bibliotecas matemáticas amplias. Por su naturaleza especializada, es posible que esta solicitud de característica no se trate durante algún tiempo.


¿Por qué ha cambiado Decimal.ToString entre V1.0 y V1.1 y qué puedo hacer para que no me afecte este cambio?

En general, se realizaron pocos cambios importantes entre V1.0 y V1.1. Uno de los más destacables es que Decimal.ToString cambió para conservar los ceros finales, mostrados por la cadena ToString predeterminada.

[C#]Decimal value = 12.246000m;Console.WriteLine(value.ToString());

V1.0 muestra 12.246. V1.1 muestra 12.246000. Este cambio fue intencionado con el fin de cumplir el estándar ECMA CLI.

Tenga en cuenta que este cambio sólo afecta al formato. Los valores 12.246 y 12.246000 se siguen considerando el mismo valor si se comparan o se hacen cálculos aritméticos con ellos. Los ceros finales (o escala) del decimal constituyen información periférica que se conserva en la mayoría de las operaciones, pero no es significativa para la igualdad del valor. Por este motivo, esto sólo rompe código que depende del formato de la cadena específica.

Para solucionar el problema y volver al comportamiento de V1.0, use el formato G29: 

[C#]Decimal value = 12.246000m;Console.WriteLine(value.ToString(G29));

Así, se mostrará 12.246 en ambas versiones, 1.0 y 1.1. El formato G con un número significa que se aplicará formato a ese número de dígitos significativos. Como 29 es la cantidad máxima de dígitos significativos que puede tener un Decimal, esto truncará los ceros finales sin redondeos.