2

我在工作中进行了一些单元测试,其中一个断言出现了一个特殊的错误。请注意,expectedValue 和 actualValue 都是双精度值。

Assert.AreEqual(expectedValue, actualValue);

例外声明它们不相等,详细说明“预期值:<6.8> 实际值:<6.8>”。

预期值是硬编码的 6.8,而实际值是使用通过我们的分类方法(例如 Equal Records 或 Jenks Natural Breaks)的数据库值制定的。

我的猜测是,差异可能是 2 个值的尾数相似,直到最低有效位。我更新了测试以包含一个 epsilon 以查找这两个值是否足够接近,但我很好奇是否有一种方法可以强制尾数与我显示该双精度的显示值相匹配。是否存在这样的尾数校正?

4

3 回答 3

3

我不完全确定强制尾数与显示值匹配是什么意思……例如没有恰好为 0.1 的双精度值。

但是,如果您想要一些代码来显示双精度的确切值,我有一个DoubleConverter.cs文件,它可以轻松完成:

 double d = 0.1;
 string x = DoubleConverter.ToExactString(d);

另一种选择是在将双精度转换为字符串时使用往返格式说明符(“r”) - 这可以保证结果有足够的信息来稍后重现相同的精确值。换句话说,如果x != y,那么x.ToString("r") != y.ToString("r")

于 2010-08-16T16:39:17.130 回答
1

您可以将两者都转换为字符串 :actualValue.ToString("0.000")并比较这些字符串。

这可以与您的要求紧密匹配。

于 2010-08-16T16:40:40.260 回答
0

如果要测试默认显示值是否匹配,只需比较默认显示值即可:

Assert.AreEqual(expectedValue.ToString(), actualValue.ToString());
于 2010-08-16T17:07:16.560 回答