【发布时间】:2016-05-23 20:59:18
【问题描述】:
Resharper 想要我更改这个现有代码:
if (pic.Height == oldH)
{
pic.Height *= fX;
}
...到这个:
if (Math.Abs(pic.Height - oldH) < TOLERANCE)
{
pic.Height *= fX;
}
...因为“浮点数与相等运算符的比较。舍入值时可能会丢失精度”
“guttersnipe”(将鼠标悬停在代码左侧 Resharper 的灯泡图标上时弹出的工具提示)是“修复浮点数比较。比较与 Epsilon 的差异” p>
代码已经运行了几个月没有问题;我很高兴使用重新锐化的代码版本让它变得更好,但是:Epsilon(“TOLERANCE”)的值应该是多少?
这是完整的代码:
internal static void ScalePicture(Picture pic, double width, double height)
{
var fX = width / pic.Width;
var fY = height / pic.Height;
var oldH = pic.Height;
if (fX < fY)
{
pic.Width *= fX;
if (pic.Height == oldH)
{
pic.Height *= fX;
}
pic.Top += (height - pic.Height) / 2;
}
else
{
pic.Width *= fY;
if (pic.Height == oldH)
{
pic.Height *= fY;
}
pic.Left += (width - pic.Width) / 2;
}
}
这样的事情是否合理:
const double TOLERANCE = 0.001;
?
注意:始终如一,R# 还希望将第二个“if (pic.Height == oldH)”与 TOLERANCE 进行比较。
【问题讨论】:
-
听起来很合理;这个人类/空间将与之相伴,至少暂时如此。
-
我遗漏了一些明显的东西,但是
oldH如何在分配pic.Height的位置和测试它与pic.Height的相等性之间变化?也就是说,这些相等性测试不总是true吗? -
好点;我从其他地方得到了这个代码;也许答案是平等测试更加挑剔;例如,赋值可能会分配 99.9999% 的值,或 100.0001% 的值,并且可以通过相等测试检测到微小的差异。
-
我在回答中链接到的页面实际上建议您不要使用 Double.Epsilon:因为 Epsilon 定义了范围接近零的正值的最小表达式,因此两个相似值之间的差异幅度值必须大于 Epsilon。通常,它比 Epsilon 大很多倍。因此,我们建议您在比较 Double 值是否相等时不要使用 Epsilon。
标签: c# image resharper precision image-scaling