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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top