c# - 对于 R# 对精度损失的提示,这是一个很好的解决方案吗?

标签 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;

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

最佳答案

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

double.Epsilon是任何两个 double 之间可能存在的最小差异。任何两个 double 都没有办法比 double.Epsilon 更接近彼此分开,所以让这个检查为真的唯一方法是它们完全相等。

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

关于c# - 对于 R# 对精度损失的提示,这是一个很好的解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24292436/

相关文章:

c# - Visual Studio 专用访问器和 checkin 代码

c++ - 获取小数点值

c# - 合格双倍显示不正常

visual-studio - 为什么 ReSharper 的清理代码选项不可用?

c# - Resharper 8 找不到接口(interface)的实现

c# - 类库中的控制台应用程序引用

c# - 如何从该类的数组中检索该类成员的数组?

c# - 删除带有条件的文本文件中的换行符

java - 双重精度损失

c# - 使用 Unity/ReSharper 隐式不起作用