Domanda
Ho un codice, e io non lo capisco. Sto sviluppando un'applicazione che la precisione è molto importante. ma non è così importante per NET, perché? Non lo so.
double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());
, ma la finestra di messaggio mostra: 3.5 Please help me, grazie.
Soluzione
Si può avere la precisione, ma dipende da che cosa si vuole fare. Se si mette il seguente in un'applicazione console:
double a = 1e-20;
Console.WriteLine(" a = {0}", a);
Console.WriteLine("1+a = {0}", 1+a);
decimal b = 1e-20M;
Console.WriteLine(" b = {0}", b);
Console.WriteLine("1+b = {0}", 1+b);
Si otterrà
a = 1E-20
1+a = 1
b = 0,00000000000000000001
1+b = 1,00000000000000000001
Ma Si noti che la funzione di Pow
, come quasi tutto nella classe Math, richiede solo raddoppia:
double Pow(double x, double y);
Quindi, non si può prendere il seno di un decimale (altri poi convertendolo raddoppiare)
Si veda anche questa domanda .
Altri suggerimenti
Se stai facendo qualcosa in cui la precisione è molto importante, è necessario essere consapevoli dei limiti di virgola mobile. Un buon riferimento è David Goldberg di "Quello che ogni computer Scientist dovrebbe sapere aritmetica alla virgola mobile ".
Si possono trovare che in virgola mobile non ti dà una precisione sufficiente ed è necessario lavorare con un tipo decimale. Questi, tuttavia, sono sempre molto più lento rispetto a virgola mobile - è un compromesso tra precisione e velocità
. La precisione di un Double
è di 15 cifre (17 cifre internamente). Il valore che si calcola con Math.Pow
è corretto, ma quando lo si aggiunge al value
semplicemente è troppo piccolo per fare la differenza.
Modifica:
Un decimale in grado di gestire che la precisione, ma non il calcolo. Se si vuole che la precisione, è necessario fare il calcolo, quindi convertire ogni valore a una Decimal
prima di aggiungere insieme:
double value = 3.5;
double small = Math.Pow(10, -20);
Decimal result = (Decimal)value + (Decimal)small;
MessageBox.Show(result.ToString());
In alternativa, utilizzare il decimale digitare anziché doppio.
Doppia precisione significa che può contenere 15-16 cifre. 3.5 + 1e-20 = 21 cifre. Essa non può essere rappresentato in doppia precicion. È possibile utilizzare un altro tipo come decimale.