相关疑难解决方法(0)

.NET上的双精度问题

我有一个简单的C#函数:

public static double Floor(double value, double step)
{
    return Math.Floor(value / step) * step;
}
Run Code Online (Sandbox Code Playgroud)

计算较高的数字,低于或等于"值",即"步数"的倍数.但它缺乏精确性,如下面的测试所示:

[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);
}
Run Code Online (Sandbox Code Playgroud)

第一个和第二个断言都可以,但是第三个断言失败,因为结果只等到第6个小数位.这是为什么?有没有办法纠正这个?

更新如果我调试测试我看到值相等,直到第8个小数位而不是第6个,可能是因为Math.Round引入了一些不精确.

注意在我的测试代码中,我写了"F"后缀(显式浮点常量),其中我的意思是"D"(双),所以如果我改变它,我可以有更多的精度.

.net c# math double

17
推荐指数
5
解决办法
4万
查看次数

标签 统计

.net ×1

c# ×1

double ×1

math ×1