c# - reinicio - hp 19 all in one instalar windows 7
¿Hay una manera de formatear un C#doble exactamente? (2)
Esta pregunta ya tiene una respuesta aquí:
- El formato se duplica para la salida en C # 10 respuestas
¿Hay alguna manera de obtener una cadena que muestre el valor exacto de un double
, con todos los lugares decimales necesarios para representar su valor preciso en la base 10?
Por ejemplo (a través de Jon Skeet y Tony the Pony ), cuando escribes
double d = 0.3;
el valor real de d
es exactamente
0.299999999999999988897769753748434595763683319091796875
Cada valor de punto flotante binario (ignorando cosas como infinito y NaN) se resolverá a un valor decimal de terminación. Entonces, con suficientes dígitos de precisión en la salida (55 en este caso), siempre puede tomar lo que esté en un double
y mostrar su valor exacto en decimal. Y poder mostrar a las personas el valor exacto sería realmente útil cuando hay una necesidad de explicar las rarezas de la aritmética de punto flotante. Pero, ¿hay una manera de hacer esto en C #?
He intentado todas las cadenas de formato numérico estándar , con y sin precisión especificada, y nada da el valor exacto. Algunos puntos destacados:
-
d.ToString("n55")
genera0.3
seguidos de 54 ceros; realiza su "vuelta a lo habitual" y luego agrega más ceros al final. Lo mismo si uso una cadena de formato personalizado de0.00000...
-
d.ToString("r")
le da un valor con suficiente precisión que si lo analiza obtendrá el mismo patrón de bits con el que comenzó, pero en este caso solo genera0.3
. (Esto sería más útil si estuviera tratando con el resultado de un cálculo, en lugar de una constante). -
d.ToString("e55")
emite2.9999999999999999000000000000000000000000000000000000000e-001
- algo de la precisión, pero no todo lo que estoy buscando.
¿Hay alguna cadena de formato que haya omitido, o alguna otra función de biblioteca, o el paquete NuGet u otra biblioteca, que pueda convertir un double
en una cadena con total precisión?
Creo que puedes hacer esto, en función de lo que quieras lograr con la pantalla:
Considera esto:
Double myDouble = 10/3;
myDouble.ToString("G17");
Tu salida será:
3.3333333333333335
Vea este enlace para saber por qué: http://msdn.microsoft.com/en-us/library/kfsatb94(v=vs.110).aspx
De forma predeterminada, el valor de retorno solo contiene 15 dígitos de precisión, aunque se mantiene internamente un máximo de 17 dígitos. Si el valor de esta instancia tiene más de 15 dígitos, ToString devuelve PositiveInfinitySymbol o NegativeInfinitySymbol en lugar del número esperado. Si necesita más precisión, especifique el formato con la especificación de formato "G17", que siempre devuelve 17 dígitos de precisión, o "R", que devuelve 15 dígitos si el número puede representarse con esa precisión o 17 dígitos si el número solo puede Ser representados con la máxima precisión.
También puedes hacer:
myDouble.ToString("n16");
Eso descartará los dígitos de ruido 16 y 17, y devolverá lo siguiente:
3.3333333333333300
Si desea mostrar el valor de la variable real como un número, es probable que desee usar "G17". Si está intentando mostrar un valor numérico que se está utilizando en un cálculo con alta precisión, querrá usar "n16".
Puede intentar usar # marcadores de posición si desea suprimir los ceros finales y evitar la notación científica. Aunque necesitará muchos de ellos para números muy pequeños, por ejemplo:
Console.WriteLine(double.Epsilon.ToString("0.########....###"));