包含在双打列表中

Contains within List of doubles

我正在使用 visual studio 立即 Window 检查我的列表的内容。这是我能看到的:

found_numbers
Count = 36
    [0]: 50,82
    [1]: 3358
    [2]: 954
    [3]: 5571
    [4]: 3142
    [5]: 700
    [6]: 322
    [7]: 402
    [8]: 1231
    [9]: 4118
    [10]: 4532
    [11]: 0
    [12]: 0
    [13]: 3101
    [14]: 18
    [15]: 0
    [16]: 0
    [17]: 8896
    [18]: 0
    [19]: 4,01
    [20]: 19,5
    [21]: 0,78
    [22]: 20,28
    [23]: 10
    [24]: 27,76
    [25]: 2,78
    [26]: 30,54
    [27]: 4648
    [28]: 508
    [29]: 1,51
    [30]: 4648
    [31]: 508
    [32]: 1,51
    [33]: 0,28
    [34]: 0,28
    [35]: 0,56

然后我检查我的两个变量的值

total1
50,82
total3
20,28

在最后一步中,我想看看我的列表是否包含这些值,这是我的输出:

found_numbers.Contains(total1)
false
found_numbers.Contains(total3)
true

我真的很困惑这种行为,因为这两个数字都在给定的列表中。为什么会这样?编辑:total1total3 都是双精度类型。

当我们使用 double 进行计算时,我们得到 舍入 错误,这就是为什么我们实际上有 50,82000000001 而不是 50,8250,81999999998。所有这些值通常 表示 四舍五入 50,82,我们有奇怪的 found_numbers.Contains(total1) == false。要获得 exact double 值,请使用 R 格式;

found_numbers[0].ToString("R")
total1.ToString("R")

尝试这些表示,您会发现差异。如果你想摆脱舍入问题,你可以:

  1. double 切换到 decimal(特别是如果值有 固定的 小数点,例如如果值是货币)
  2. 比较时使用公差
//TODO: put the right value here
double tolerance = 1e-8;

bool found = found_numbers.Any(item => Math.Abs(item - total1) <= tolerance);