Ho una semplice funzione C#:problemi doppie precisione su NET
public static double Floor(double value, double step)
{
return Math.Floor(value/step) * step;
}
che calcola il numero maggiore, minore o uguale a "valore", cioè multiplo di "step". Ma manca di precisione, come si vede nelle seguenti prove:
[TestMethod()]
public void FloorTest()
{
int decimals = 6;
double value = 5F;
double step = 2F;
double expected = 4F;
double actual = Class.Floor(value, step);
Assert.AreEqual(expected, actual);
value = -11.5F;
step = 1.1F;
expected = -12.1F;
actual = Class.Floor(value, step);
Assert.AreEqual(Math.Round(expected, decimals),Math.Round(actual, decimals));
Assert.AreEqual(expected, actual);
}
La prima e la seconda afferma sono ok, ma il terzo fallisce, perché il risultato è pari solo fino al decimale 6a. Perché? C'è un modo per correggere questo?
Aggiornamento Se eseguo il debug del test, vedo che i valori sono uguali fino all'ottavo decimale anziché al sesto, forse perché Math.Round introduce qualche imprecisione.
Nel mio codice di test ho scritto il suffisso "F" (costante float esplicita) dove intendevo "D" (doppio), quindi se lo cambio posso avere più precisione.
ma la F maiuscola significa doppio, non float, giusto? è la f minuscola che significa galleggiare. –
No, ho appena controllato: float x = 1.0; dà un errore, float x = 1.0F; è OK. La F non è sensibile al maiuscolo/minuscolo. –
E ha cercato in Ecmea334: 1.0D per il doppio, 1.0 M per decimale. –