У меня есть простая функция С#:
public static double Floor(double value, double step)
{
return Math.Floor(value / step) * step;
}
Это вычисляет большее число, меньшее или равное "значению", которое кратно "шагу". Но ему не хватает точности, как видно из следующих тестов:
[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);
}
Первый и второй утверждения одобрены, но третий не работает, потому что результат равен только 6-му знаку после запятой. Почему это? Есть ли способ исправить это?
Обновить. Если я отлаживаю тест, я вижу, что значения равны до восьмого десятичного разряда вместо 6-го, возможно, потому, что Math.Round вводит некоторую неточность.
Примечание. В моем тестовом коде я написал суффикс "F" (явная константа float), где я имел в виду "D" (double), поэтому, если я изменю, у меня может быть больше точности.