que tienen una simple función de C#:problemas de doble precisión en .NET
public static double Floor(double value, double step)
{
return Math.Floor(value/step) * step;
}
que calcula el número mayor, menor o igual que el "valor", que es múltiplo de "paso". Pero carece de precisión, como se ve en las siguientes pruebas:
[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);
}
El primer y el segundo afirma están bien, pero la tercera falla, porque el resultado es solamente igual hasta que el sexto decimal. ¿Porqué es eso? ¿Hay alguna manera de corregir esto?
Actualización Si depuro la prueba, veo que los valores son iguales hasta el octavo lugar decimal en lugar de la 6ª, tal vez porque Math.Round presenta cierta imprecisión.
Nota En mi código de prueba que escribió el sufijo "F" (explícita constante float), donde me refería a "D" (doble), por lo que si puedo cambiar lo que puedo tener más precisión.
pero la F mayúscula significa doble, no flotar, ¿verdad? es la f minúscula que significa flotar. –
No, acabo de comprobar: flotante x = 1.0; da un error, float x = 1.0F; está bien La F no distingue entre mayúsculas y minúsculas. –
Y lo busqué en Ecmea334: 1.0D para el doble, 1.0M para el decimal. –