У меня есть простая функция C #:
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);
}
Первое и второе утверждения в порядке, но третье не дает результатов, потому что результат равен только до шестого десятичного знака. Это почему? Есть ли способ исправить это?
Обновление Если я отлаживаю тест, я вижу, что значения равны до восьмого десятичного знака вместо шестого, возможно, потому что Math.Round вносит некоторую неточность.
Примечание В своем тестовом коде я написал суффикс «F» (явная константа с плавающей точкой), где я имел в виду «D» (двойной), поэтому, если я изменю его, я могу иметь большую точность.