2010-01-20 12 views
16

¿Cómo evito que se redondee mi valor doble al convertir a una cadena? He intentado ambos Convert.ToString y ToString() con el mismo resultado.¿Por qué ToString() redondea mi doble valor?

Por ejemplo, mi doble puede parecerse a 77.987654321, y las conversiones de dos cadenas se convierten en 77.98765. Necesito mantener la precisión del valor tal como está.

+1

Para mí ToString() mantiene la precisión. Algún código sería bueno. –

+0

Vea también http://stackoverflow.com/questions/1421520/formatting-doubles-for-output-in-c –

Respuesta

23

Por defecto, el método .ToString() de Double devuelve 15 dígitos de precisión. Si quiere los 17 dígitos completos que el valor doble contiene internamente, debe pasar el especificador de formato "G17" al método.

String s = value.ToString("G17"); 

procedente de la MSDN docs:

Por defecto, el valor de retorno sólo se contiene 15 dígitos de precisión aunque un máximo de 17 dígitos se mantiene internamente. 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 "G17" formato, que siempre devuelve 17 dígitos de precisión, o "R", que devuelve 15 dígitos si el número se puede representar con la precisión o 17 dígitos si el número solo se puede representar con una precisión máxima de .

+0

Hace que uno se pregunte por qué no devuelven los 17 dígitos automáticamente y dejan que los usuarios lo rodeen si lo desean. –

+0

@Robert: Sé lo que quieres decir. Es extraño que los pierdan. Si fueran cientos, lo entendería, pero por el bien de 2 dígitos parece extraño. –

+0

Tenga en cuenta que dice "a * maximum * of 17 digits". Los dos últimos probablemente sean inexactos, lo que parece una razón válida para dejarlos fuera de manera predeterminada. – Thomas

5

La clase DoubleConverter de Jon Skeet tiene un método ToExactString() que devolverá el valor exacto del doble como una cadena.

http://www.yoda.arachsys.com/csharp/DoubleConverter.cs

+0

información sobre la licencia para este código? –

+0

Probablemente deberías preguntarle a Jon, pero es muy probable que "lo uses como quieras". La mayoría de los proyectos de GitHub de Jon son Apache o BSD. –

13

Pruebe algo como

myDouble.ToString("R") 

Véase también The Round-trip ("R") Format Specifier:

El ida y vuelta ("R") garantiza especificador de formato que un valor numérico que se convierte en una la cadena se analizará de nuevo en el mismo valor numérico.

0

Sin garantías, pero intente ToString ("R").

2

Supongo que la respuesta principal para redondear los dos últimos dígitos es ocultar la inestabilidad/redondeo numérico debido a la precisión flotante/doble finita.

Ejemplo sin ninguna aproximación:

(Math.Sqrt(7)).ToString("G17") = "2.6457513110645907" 

(Math.Sqrt(7)+6).ToString("G17") = "8.6457513110645898" 

parece un poco extraño en los últimos 3 dígitos, ¿verdad?

Ejemplo con el redondeo:

(Math.Sqrt(7)).ToString() = "2.64575131106459" 

(Math.Sqrt(7)+6).ToString() = "8.64575131106459" 

Look "perfecta", ¿verdad?

:-)

Cuestiones relacionadas