【发布时间】:2010-10-08 16:38:14
【问题描述】:
我有一个简单的 C# 函数:
public static double Floor(double value, double step)
{
return Math.Floor(value / step) * step;
}
即计算较大的数,小于等于“value”,即“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 位。这是为什么?有什么办法可以改正吗?
更新如果我调试测试,我发现直到小数点后第 8 位而不是第 6 位的值都是相等的,这可能是因为 Math.Round 引入了一些不精确性。
注意在我的测试代码中,我写了“F”后缀(显式浮点常量),我的意思是“D”(双精度),所以如果我改变它,我可以有更高的精度。
【问题讨论】: