2009-04-20 20 views

Respuesta

11

El problema es probable debido al hecho de que Double.MaxValue se convirtió en una cadena, y cuando la cadena se emite, no todos los dígitos se envían, sino que se redondea. Al analizar este valor, se desborda el doble.

Usando Double.TryParse y posteriormente comprobar la igualdad en la cadena "1.79769313486232E + 308" en caso de fallo y sustituyendo Double.MaxValue debe ser una solución rápida, si es necesario para mantener la cadena de la manera que es.

EDITAR: Por supuesto, si no necesita mantener la cuerda como está, use el Round Trip format specifier para producir la cadena en primer lugar, como Jon describes in his answer.

1

Puede intentar double.Parse() o double.TryParse() en lugar de Convert.ToDouble(), pero no estoy seguro de que va a obtener mejores resultados. Por cierto, la cadena que proporcione es igual a double.MaxValue, que es (por supuesto) el valor máximo que puede contenerse en un doble, por lo que es probable que provenga de su error. Los tipos numéricos de punto flotante son quisquillosos, así que supongo que se está produciendo algún tipo de redondeo y lo empuja fuera de los límites del tipo.

También podría probar el tipo de datos decimal. Puedes tener mejor suerte allí.

+1

o simplemente utilizar double.MaxValue directamente? O haga una prueba de cadena para esa cadena en particular y sustituya double.MaxValue, ya que obviamente es un caso especial. – gbarry

+1

Decimal no funcionará en absoluto. Decimal.MaxValue codekaizen

-2

Ese número es demasiado grande para un doble, como dice la excepción. Tendrá que encontrar una gran biblioteca numérica para manejarlo, ya que no hay nada que yo sepa en la biblioteca .Net que maneja números muy grandes.

21

Lamentablemente este valor es mayor que double.MaxValue, de ahí la excepción.

Como lo sugiere codekaizen, podría codificar una prueba para la cadena. Una mejor alternativa (IMO) si eres el que produce la cadena en primer lugar es usar el especificador de formato "r". A continuación, la cadena que produzca será "1.7976931348623157E + 308" en lugar, que a continuación, analiza correctamente:

string s = double.MaxValue.ToString("r"); 
double d = double.Parse(s); // No exception 

Obviamente eso no ayuda si usted no tiene control sobre los datos - pero entonces usted debe entender que eres probablemente ya esté perdiendo datos en ese caso.

+1

+1 para la mención del especificador de formato de ida y vuelta "r". –

1

Esto es lo que se me ocurrió. Gracias Jon Skeet y Codekaizen.

private double convertToDouble(string str) 
{ 
    double dbl; 

    if (double.TryParse(str, out dbl)) 
     return dbl; 

    if (str == "1.79769313486232E+308") 
     return double.MaxValue; 

    return double.MinValue; 
} 
1

Demuestra el problema y la solución:

var s = double.MaxValue.ToString(); 
double d; 
if (!double.TryParse(s, out d)) { 
    d = s.Equals(double.MaxValue) ? double.MaxValue : double.MinValue; 
} 
Cuestiones relacionadas