【问题标题】:Can't compare two CLLocationCoordinate2Ds (negative zero??)无法比较两个 CLLocationCoordinate2D(负零??)
【发布时间】:2013-08-14 13:38:34
【问题描述】:

我很难在我的 iOS 应用程序中比较两个(应该相同的)CLLocationCoordinate2D 结构。由于某种原因,无论我如何比较它们,纬度都不会说它是平等的。

代码:

double dlat = self.mapView.centerCoordinate.latitude - self.centerOnNextView.coordinate.latitude;
double dlong = self.mapView.centerCoordinate.longitude - self.centerOnNextView.coordinate.longitude;
NSLog(@"dlat: %f dlong: %f, dlat == 0.0: %d, dlat == -0.0: %d, dlong == 0.0: %d, dlong == -0.0: %d",
    dlat, dlong, dlat == 0.0, dlat == -0.0, dlong == 0.0, dlong == -0.0);
if ( ( dlat == 0.0 || dlat == -0.0 ) && ( dlong == 0.0 || dlong == -0.0 ) ) {
    NSLog(@"WE ARE EQUAL!");
}

我什至尝试过if ( [@(dlat) isEqualToNumber:@(0)] && [@(dlong) isEqualToNumber:@(0)] ) 作为比较检查,但也失败了。

这是输出:

dlat: -0.000000
dlong: 0.000000
dlat == 0.0: 0 (false)
dlat == -0.0: 0 (false)
dlong == 0.0: 1 (true)
dlong == -0.0: 1 (true)

出于某种原因,我只是不断地得到那个负零,没有什么可以与之相比。我该怎么做才能比较这些东西?!

【问题讨论】:

  • 什么,周一晚上 9:30 没人上班? XD
  • dlat 很可能不为 0。可能是您的 printf 的精度将其四舍五入以进行显示。

标签: c floating-point core-location cllocationcoordinate2d


【解决方案1】:

dlat 的值不是 0.0。 打印时使用%e,而不是%f,以查看区别。

将一个数字与dlat == 0.0 中的0.0 进行比较,得到与dlat == -0.0 相同的结果。无需同时进行两个比较。


更多关于 -0
0.0 和 -0.0 具有相同的 numeric 值,并且在六个比较运算符 >=、>、==、!=、

如果一个必须区分零,可以使用int signbit()memcmp()。有很多方法。

【讨论】:

  • 你是对的,它实际上是 -7.105427e-15 出于某种原因,即使我之前实际上将中心坐标设置为相同的值。确实很奇怪。我想唯一的方法是做一个
  • 1. self.mapView.centerCoordinate.latitudeself.centerOnNextView.coordinate.latitude 类型为 float? 2. 尝试%a 以获得精确的十六进制表示法。您的值可能相差 1 位。
猜你喜欢
  • 2012-04-29
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2020-11-21
  • 2019-05-23
  • 1970-01-01
相关资源
最近更新 更多