我的项目中有一段代码比较两个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/