我尝试比较两个相同的纬度,其类型为Double
,当我打印结果时,它的计算结果为false
。
print("spot latitude: " + String(spot.location.latitude))
print("first object: " + String(firstSpot.location.latitude))
print(spot.location.latitude == firstSpot.location.latitude)
输出量:
spot latitude: 32.8842183049047
first object: 32.8842183049047
false
有人知道发生了什么吗?
8条答案
按热度按时间7vux5j2d1#
比较双精度数中的相等性很难得到预期的结果,这是由于双精度数的存储方式所致。您可以创建自定义运算符,请记住,您应该以一定的准确性进行操作。
要了解更多信息,您可以查看此answer,即使它讲述的是ObjC,这些原则也是非常有效的。
由于我在网上也遇到了同样的问题,我在苹果开发论坛上找到了这个answer。
这个函数应该够用了,你可以很容易地创建一个自定义的运算符:
我试着从swift 2.x转换到3.x,似乎宏
DBL_EPSILON
不再可用。xlpyo6sf2#
在大多数编程语言中,用==比较双精度型或浮点型值不会给予预期的结果,这意味着你认为应该相等的数字实际上略有不同。相反,计算绝对差值,如果差值低于某个阈值,则将这些数字视为相等。有关更多解释,请参阅Compare double to zero using epsilon。
zaqlnxep3#
雨燕5,4
可能四舍五入的解决方案是获得接近值的最佳选择:
如果用epsilon来修正,反正我得到的假等于是双精度的:
iyfamqjs4#
您可以使用此扩展名
或根据this guide
mqkwyuun5#
我想是因为你的两个双精度数实际上是不同的。当你把双精度数转换成十进制数的字符串时,由于浮点数的表示,四舍五入是不可避免的。即使两个字符串看起来一样,实际的数字也可能不同。更多细节请看这个。
您可以使用指定更多数字来进一步检查两个数字:
vdgimpew6#
斯威夫特4.1:
我找到了一个解决方案,非常适合我。它灵活,因为您可以定义比较的“精度”,方法是传递应该考虑的小数位数,并将其作为Double的扩展。
例如,假设我们有两个值:
当仅考虑3个小数位时,这些值被视为“相等”,但当考虑8个小数位时,这些值被视为“不相等”。
krugob8w7#
将不同的
Swift 4
技术融合在一起:用法:
注意
~<=
是小于(<=
)运算符的模糊比较版本,而
~>=
是模糊比较大于(>=
)运算符。此外,最初我使用的是
Double.ulpOfOne
,但改为常量(更模糊)。最后,正如我的个人资料中提到的,在
Apache 2.0
许可证下的使用也是允许的(没有归属需要)。测试
e4yzc0pl8#
请遵循以下更新的代码
输出量