Pregunta

Estoy teniendo algún problema extraño aquí. Tengo una tabla de base de datos, que tiene un enorme valor almacenado en una columna. Mi solicitud (C #) es la lectura de este valor y mantener en un doble tipo. Esta aplicación va a insertar el mismo valor a otra mesa. Nota: No estoy haciendo ningún cálculo / procesamiento en el valor leído de la primera tabla. Sólo se mantiene para la actualización de la segunda tabla.

El tema aquí es, la segunda tabla es cada valor ligeramente diferente que en la primera tabla. Parece que el número es el redondeo cuando se guardo en el tipo doble.

Aquí es un ejemplo de valores.

Valor original: 18014398509481984

Valor copiado en la nueva tabla: 18014398509482000

Los valores se ve diferente, pero ambos son iguales en la realidad. Hice una búsqueda en Google con 18014398509481984 a 18014398509482000 como un término de búsqueda y regresó resultado 0 , que significa tanto son idénticos.

Preguntas

1 - Si ambos son iguales, por qué el segundo valor se ve diferente? Veo 1984 convertido en 2000 .

2 - ¿Por qué ocurre la conversión

3 -? Cómo puedo evitar este tipo de conversiones

Cualquier ayuda sería grande!

¿Fue útil?

Solución

Trate de usar un System.Decimal para almacenar el valor de la primera tabla, en lugar de un System.Double. no parece System.Double para contener suficientes dígitos significativos para almacenar tan grande de un valor de precisión.

Otros consejos

Un valor de doble precisión es exacto sólo para 15 o 16 dígitos decimales (véase aquí para una explicación). Si necesita almacenar más de esto, entonces usted tendrá que utilizar un formato de número diferente. Si desea trabajar con números enteros muy grandes sin perder precisión, entonces hay varias clases por ahí para ayudar te gusta éste .

Si usted está recibiendo un valor de SQL, asegúrese de que el tipo de datos de destino en .NET coincide - bigint SQL para C # larga, por ejemplo -. Para evitar problemas de redondeo como esto

Creo que esto es debido a la precisión de punto flotante (el gran número utilizará una mantisa de un exponente), lo que significa que en esencia sería representado como un número de facciones con una potencia. números fraccionarios sin embargo se encuentran con errores de redondeo debido a la aritmética de coma flotante.

Normalmente, la manera alrededor de esto es evitar valores de punto (prueba Int64), utilizar un tipo más preciso (decimal) o la cuenta por el error y hacer un 'aprox igual a'. Flotante

¿Es necesario almacenar estos como números de punto flotante?

Si no, entonces usted podría utilizar números enteros de 64 bits en su lugar: BIGINT en la base de datos, y long / Int64 en su aplicación.

Estos tienen un rango de -9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807 y no hay problemas de precisión / exactitud.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top