Grandi numeri arrotondamento [c #]
Domanda
Sto avendo qualche problema strano qui. Ho una tabella del database che ha un valore enorme memorizzato su una colonna. La mia domanda (C #) è la lettura di questo valore e mantenere in un doppia tipo. Questa applicazione inserirà lo stesso valore di un'altra tabella. Nota: io non sto facendo alcun calcolo / elaborazione sul valore letto dalla prima tabella. E 'appena tenuto per aggiornare la seconda tabella.
problema qui è, la seconda tabella è sempre valore leggermente diverso rispetto al primo tavolo. Sembra che il numero è arrotondamento quando io continuo nel tipo double.
Ecco un esempio di valori.
Valore originale: 18014398509481984
Valore copiato nuova tabella: 18014398509482000
I valori di un aspetto diverso, ma entrambi sono gli stessi nella realtà. Ho fatto una ricerca su Google con 18014398509481984-18014398509482000 come un termine di ricerca e tornò risultato 0 , che significa sia sono gli stessi.
Domande :
1 - Se entrambi sono uguali, per cui il secondo valore sembra diverso? Posso vedere 1984 trasformato in 2000 .
2 - Perché la conversione avviene
3 - Come posso evitare questo tipo di conversioni
Qualsiasi aiuto sarebbe grande!
Soluzione
Provare a usare un System.Decimal
per memorizzare il valore dalla prima tabella, invece di un System.Double
. System.Double
non sembra contenere cifre significative sufficiente per memorizzare quella grande di un valore preciso.
Altri suggerimenti
Un valore a doppia precisione indica una 15 o 16 cifre decimali (vedi qui per una spiegazione). Se avete bisogno di memorizzare più di questo, allora si dovrà utilizzare un formato numerico diverso. Se si desidera lavorare con molto grandi numeri interi senza perdere la precisione, poi ci sono varie classi là fuori per aiutarti a questo uno .
Se stai ricevendo un valore di SQL, assicurarsi che il tipo di dati di destinazione in .NET corrisponde - SQL bigint per C # a lungo, per esempio -. Per evitare problemi di arrotondamento come questo
Credo che questo sia dovuto alla precisione in virgola mobile (il gran numero utilizzerà una mantissa un esponente), il che significa che sarebbe essenzialmente essere rappresentato come numero fazione con una potenza. numeri frazionari tuttavia incontrano errori di arrotondamento a causa di aritmetica in virgola mobile.
Normalmente la soluzione a questo è quello di evitare i valori puntuali (provate Int64), utilizzare un tipo più precisa (decimale) o conto dell'errore e fare un 'circa uguale a'. Galleggiamento
Avete bisogno di memorizzare questi come numeri in virgola mobile?
Se poi non si potrebbe usare interi a 64 bit invece: BIGINT
nel database, e long
/ Int64
nella vostra app.
Questi hanno un range da -9.223.372.036.854.775.808 fino a 9.223.372.036.854.775.807 e nessun problema di precisione / accuratezza.