Linq数据类型与Double比较

时间:2013-05-23 01:49:30

标签: c# linq rounding

在我的Linq查询中,我有一个where语句,看起来像这样

&& vio.Bows.Any(nw => nw.XCoordinate.Equals(currVio.XCoordinate)))

nw.XCoordinate = 4056.48751252685
currVio.XCoordinate = 4056.488

因此,Equals的声明不起作用,最简单的方法是什么?

public double XCoordinate { get; set; }

2 个答案:

答案 0 :(得分:3)

您可以通过计算绝对差异,并将其与较小的值进行比较,使用通常的方式比较double的邻近度:

Math.Abs(x - y) < 1E-8 // 1E-8 is 0.00000001

例如,您可以在LINQ查询中使用此方法,如下所示:

&& vio.Bows.Any(nw => Math.Abs(nw.XCoordinate-currVio.XCoordinate) < 0.001)

答案 1 :(得分:0)

你也可以使用Math.Round,即:

double x = 4056.48751252685;
var newx = Math.Round(x,3);

所以,如果你知道你总是想要3个小数位,你可以:

&& vio.Bows.Any(nw => Math.Round(nw.XCoordinate,3).Equals(math.Round(currVio.XCoordinate,3))))

您可以更进一步实现IEquetable,并覆盖equals函数,确定两个值中的哪一个具有最小的小数位数,将两者都舍入到该值并进行比较。