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.

È stato utile?

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.

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