包含在双打列表中
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
我真的很困惑这种行为,因为这两个数字都在给定的列表中。为什么会这样?编辑:total1 和 total3 都是双精度类型。
当我们使用 double
进行计算时,我们得到 舍入 错误,这就是为什么我们实际上有 50,82000000001
而不是 50,82
或 50,81999999998
。所有这些值通常 表示 四舍五入 为 50,82
,我们有奇怪的 found_numbers.Contains(total1) == false
。要获得 exact double
值,请使用 R
格式;
found_numbers[0].ToString("R")
total1.ToString("R")
尝试这些表示,您会发现差异。如果你想摆脱舍入问题,你可以:
- 从
double
切换到 decimal
(特别是如果值有 固定的 小数点,例如如果值是货币)
- 比较时使用公差:
//TODO: put the right value here
double tolerance = 1e-8;
bool found = found_numbers.Any(item => Math.Abs(item - total1) <= tolerance);
我正在使用 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
我真的很困惑这种行为,因为这两个数字都在给定的列表中。为什么会这样?编辑:total1 和 total3 都是双精度类型。
当我们使用 double
进行计算时,我们得到 舍入 错误,这就是为什么我们实际上有 50,82000000001
而不是 50,82
或 50,81999999998
。所有这些值通常 表示 四舍五入 为 50,82
,我们有奇怪的 found_numbers.Contains(total1) == false
。要获得 exact double
值,请使用 R
格式;
found_numbers[0].ToString("R")
total1.ToString("R")
尝试这些表示,您会发现差异。如果你想摆脱舍入问题,你可以:
- 从
double
切换到decimal
(特别是如果值有 固定的 小数点,例如如果值是货币) - 比较时使用公差:
//TODO: put the right value here
double tolerance = 1e-8;
bool found = found_numbers.Any(item => Math.Abs(item - total1) <= tolerance);