C#.Net双重问题...... 6.8!= 6.8?

时间:2010-08-16 16:36:15

标签: .net floating-accuracy error-correction

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

Assert.AreEqual(expectedValue, actualValue);

例外情况表明它们并不相同,详细说明了“期望值:< 6.8>实际值:< 6.8&gt ;.”

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

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

3 个答案:

答案 0 :(得分:3)

我并不完全确定强迫尾数与显示值匹配的含义...例如, 没有正好为0.1的双精度值。

如果您希望某些代码显示双精度的完全值,我会有一个DoubleConverter.cs文件,这样可以轻松实现:

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

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

答案 1 :(得分:1)

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

可以紧密匹配您的要求。

答案 2 :(得分:0)

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

Assert.AreEqual(expectedValue.ToString(), actualValue.ToString());