C# Linq数据类型与双精度的比较
在我的Linq查询中,我有一个where语句,如下所示C# Linq数据类型与双精度的比较,c#,linq,rounding,C#,Linq,Rounding,在我的Linq查询中,我有一个where语句,如下所示 && vio.Bows.Any(nw => nw.XCoordinate.Equals(currVio.XCoordinate))) 价值观是 nw.XCoordinate = 4056.48751252685 currVio.XCoordinate = 4056.488 因此,平等的陈述是不起作用的,什么是最简单的圆的方法 public double XCoordinate { get; set; } 通过计算
&& vio.Bows.Any(nw => nw.XCoordinate.Equals(currVio.XCoordinate)))
价值观是
nw.XCoordinate = 4056.48751252685
currVio.XCoordinate = 4056.488
因此,平等的陈述是不起作用的,什么是最简单的圆的方法
public double XCoordinate { get; set; }
通过计算绝对差值,并将其与较小的值进行比较,您可以使用比较接近度的常规方法:
Math.Abs(x - y) < 1E-8 // 1E-8 is 0.00000001
Math.Abs(x-y)<1E-8//1E-8为0.00000001
例如,您可以在LINQ查询中使用这种方法,如下所示:
&& vio.Bows.Any(nw => Math.Abs(nw.XCoordinate-currVio.XCoordinate) < 0.001)
和&vio.Bows.Any(nw=>Math.Abs(nw.XCoordinate currVio.XCoordinate)<0.001)
您也可以使用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))))
您可以进一步实现并重写equals函数,确定两个值中哪一个的小数位数最少,将两者四舍五入到该值并进行比较。您不能简单地使用equals来比较两个双倍数。检查这个问题:注意到有时候数字可能是4056。49@ChrisHamilton然后您需要将“容差”级别提高到大于
0.001
,例如0.005
。我知道,我尝试了0.01,但0.005效果更好!又是thx