对于R#关于精度损失的投诉,这是一个很好的解决方案吗?

时间:2014-06-18 18:15:57

标签: c# double resharper mathematical-optimization epsilon

我的项目中有一些代码比较了两个double值,看它们的差异是否超过0,例如:

if (totValue != 1.0)

Resharper抱怨这个,建议我应该使用“EPSILON”并在代码中添加这样的常量(当被邀请时)。但是,它不会自己创建常量或建议它应该是什么值。这是一个很好的解决方案:

const double EPSILON = double.Epsilon; // see http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx
. . .
if (Math.Abs(totValue - 1.0) > EPSILON)
    compValue = Convert.ToString(totValue*Convert.ToDouble(compValue));

更新

我把它更改为:

const double EPSILON = 0.001;

...认为可能既大又小又适合典型的双重瓦(不是科学的东西,只是“我有2.5个这样的”,等等。)

2 个答案:

答案 0 :(得分:3)

不,这对你的epsilon来说不​​是一个明智的价值。您拥有的代码与直接相等检查没有什么不同。

double.Epsilon是任何两个双打之间可能存在的最小差异。任何两个双打都不可能比double.Epsilon分开更接近彼此,因此这种检查的唯一方法是使它们完全相等。 / p>

至于你应该实际使用的epsilon值,这完全取决于,这就是为什么不为你自动生成的原因。这一切都取决于您对数据执行的操作类型(这会影响可能偏离"真值")以及您应用程序中实际关注的精度(当然如果您关心的精度大于误差范围,则表示您遇到问题。您的epsilon需要大于(或等于)所需精度的精度值,同时小于对任一数值执行的所有操作的可能误差范围。

答案 1 :(得分:1)

是。但更好的是不使用浮点数。使用decimal instad。

但是,如果出于某种原因,你必须坚持double永远不要直接比较,那就意味着,永远不要依赖于a-b == 0 {(1}}和a是一些b值,这些值相等。

浮点运算速度快但不精确,考虑到这一点,R#是正确的。