Sono in esecuzione test NUnit per valutare alcuni dati di test noti e risultati calcolati. I numeri sono in virgola mobile a virgola mobile quindi non mi aspetto che siano esattamente uguali, ma non sono sicuro di come trattarli come uguali per una determinata precisione.Valutare se due doppi sono uguali in base a una determinata precisione, non entro una certa tolleranza fissa
In NUnit possiamo confrontare con una tolleranza fissa:
double expected = 0.389842845321551d;
double actual = 0.38984284532155145d; // really comes from a data import
Expect(actual, EqualTo(expected).Within(0.000000000000001));
e che funziona bene per i numeri sotto lo zero, ma, come i numeri crescono la tolleranza ha davvero bisogno di essere cambiato così abbiamo sempre a cuore lo stesso numero di cifre di precisione.
In particolare, questo test fallisce:
double expected = 1.95346834136148d;
double actual = 1.9534683413614817d; // really comes from a data import
Expect(actual, EqualTo(expected).Within(0.000000000000001));
e, naturalmente, i numeri più grandi non riescono con la tolleranza ..
double expected = 1632.4587642911599d;
double actual = 1632.4587642911633d; // really comes from a data import
Expect(actual, EqualTo(expected).Within(0.000000000000001));
Qual è il modo corretto di valutare due numeri in virgola mobile sono uguali con una data precisione ? C'è un modo integrato per farlo in NUnit?
Questa è un'ottima soluzione, ma genera un'eccezione quando si confrontano da '0.0' a' 0.0'. Tuttavia, una semplice condizione 'if' attorno a' expected' si occuperebbe di ciò. –
Ah si. Pensavo che ci sarebbe stato qualcosa. :) Ho aggiornato la mia risposta per tener conto di questo. – Brett
ha funzionato molto bene. Ho eseguito 105 test unitari, circa la metà positivi e metà negativi, e tutti tranne 8 passati. La risposta di Michael Borgwardt ha superato e ha fallito esattamente gli stessi test. –