Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq数据类型与双精度的比较_C#_Linq_Rounding - Fatal编程技术网

C# Linq数据类型与双精度的比较

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; } 通过计算

在我的Linq查询中,我有一个where语句,如下所示

&& 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