Question

J'ai une question bizarre ici. J'ai une table de base de données qui a un énorme valeur stockée sur une colonne. Mon application (C #) est en train de lire cette valeur et le maintien dans un à double de type. Cette application insérera la même valeur à une autre table. Note: Je ne fais aucun calcul / traitement de la valeur lue de la première table. Il est juste gardé pour mettre à jour la deuxième table.

L'enjeu est ici, la deuxième table devient valeur légèrement différente de celle de la première table. On dirait que le nombre est arrondi quand je garde dans le type double.

Voici un exemple de valeurs.

Valeur d'origine: 18014398509481984

Valeur copiée à nouvelle table: 18014398509482000

Les valeurs est différent, mais les deux sont identiques en réalité. Je l'ai fait une recherche google avec 18014398509481984-18014398509482000 comme un terme de recherche et résultat retourné 0 , ce qui signifie à la fois sont identiques.

Questions :

1 - Si les deux sont identiques, pourquoi la deuxième valeur est différente? Je peux voir 1984 transformé en 2000 .

2 - Pourquoi la conversion se produit

3 - Comment puis-je éviter ce type de conversions

Toute aide serait génial!

Était-ce utile?

La solution

Essayez d'utiliser un System.Decimal pour stocker la valeur de la première table, au lieu d'un System.Double. System.Double ne semble pas contenir suffisamment de chiffres significatifs pour stocker cette grande d'une valeur précise.

Autres conseils

Une double valeur de précision est exacte seulement à 15 ou 16 chiffres décimaux (voir ici pour une explication). Si vous avez besoin de stocker plus de cela, vous devrez utiliser un format de numéro différent. Si vous voulez travailler avec des entiers très grands sans perdre la précision, alors il y a différentes classes là pour vous aider comme celui-ci .

Si vous obtenez une valeur de SQL, assurez-vous que votre cible type de données dans .NET correspond - bigint SQL pour C # à long par exemple -. Pour éviter les problèmes d'arrondi comme celui-ci

Je crois que cela est dû à une précision en virgule flottante (le grand nombre utilisera un mantisse un exposant), ce qui signifie qu'il serait essentiellement représenté comme un certain nombre de factions avec une puissance. nombres fractionnaires rencontrent cependant des erreurs d'arrondi en raison de l'arithmétique à virgule flottante.

Normalement, le tour est d'éviter les valeurs à virgule flottante (essayez Int64), utilisez un type plus précis (décimal) ou d'un compte de l'erreur et faire une « environ égal à ».

Avez-vous besoin de stocker ceux-ci comme nombres à virgule flottante?

Dans le cas contraire, vous pouvez utiliser des entiers de 64 bits au lieu: BIGINT dans la base de données, et long / Int64 dans votre application.

Ceux-ci ont une gamme de -9.223.372.036.854.775.808 jusqu'à 9.223.372.036.854.775.807 et aucun problème de précision / précision.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top