C# 这对R&x27是一个好的解决方案吗;她抱怨精度下降?

C# 这对R&x27是一个好的解决方案吗;她抱怨精度下降?,c#,double,resharper,mathematical-optimization,epsilon,C#,Double,Resharper,Mathematical Optimization,Epsilon,我的项目中有一些代码比较了两个双精度值,以查看其差值是否超过0,例如: if (totValue != 1.0) Resharper对此表示不满,建议我使用“EPSILON”,并在代码中添加了这样一个常量(当被邀请这样做时)。但是,它不会创建常量本身,也不会建议它应该是什么值。这是一个好的解决方案吗: const double EPSILON = double.Epsilon; // see http://msdn.microsoft.com/en-us/library/system.doub

我的项目中有一些代码比较了两个双精度值,以查看其差值是否超过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;

…认为这可能既大又小,足以用于典型的双VAL(不是科学的东西,只是“我有2.5个这样的”,等等)

是的。但最好不要使用浮点。使用
decimal
instad

但是,如果出于某种原因,您必须坚持使用
double
而不要直接比较,这意味着,不要依赖于例如
a-b==0
,而(
a
b
是一些
double
值,它们应该相等)


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

不,它不是一个合理的epsilon值。您拥有的代码与直接的相等检查没有什么不同

double.Epsilon
是任意两个double之间可能存在的最小差异。任何两个double都只有通过相隔
double.Epsilon
才能更接近彼此,因此该检查为真的唯一方法是使它们完全相等


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

由于我的回答中所述的原因,他使用的epsilon值不合适。绝对正确。我关注的是浮点问题,不是“你有多在乎”,而是“你期望有多大的错误”。将ε设置为您关心的程度可以隐藏错误。@alzaimarε需要介于两者之间,正如我在回答中所说的。你不能只解释其中一个。如果两者之间没有空隙,也就是说,你的误差幅度大于你所要求的精度,那么问题是无法解决的,你要么需要减小误差幅度,要么以降低的精度生活。