我有一个简单的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);
}第一个和第二个断言是可以的,但是第三个断言失败了,因为结果仅等于小数点第6位。为什么会这样呢?有什么办法纠正这个问题吗?
Update --如果我调试测试--我看到这些值在小数点8位之前是相等的,而不是第6位,这可能是因为Math.Round引入了一些不精确。
Note在我的测试代码中,我写了"F“后缀(显式浮动常量),意思是"D”(双),所以如果我更改了,就可以具有更高的精度。
https://stackoverflow.com/questions/566958
复制相似问题