0

更具体地说,如何进一步测试?我看到另一个帖子,其中答案使用了 hexdump。我该如何尝试这个,我应该怎么做?

这是我在控制台中的尝试...

变量: myl 是我数据库中的纬度值。ul 是来自 api 的值。ll 是我手动重新输入值的地方:

ruby-1.9.2-p180 :106 > myl=a.latitude   #=> "42.3471841"
ruby-1.9.2-p180 :107 > ul=@events[30].xpath('venue')[0]['lat']
=> "42.3471836"
ruby-1.9.2-p180 :108 > myl==ul   #=> false
ruby-1.9.2-p180 :109 > myl==ul.to_i   #=> false
ruby-1.9.2-p180 :110 > myl.to_i==ul.to_i   #=> true
ruby-1.9.2-p180 :111 > Venue.find_by_latitude(ul)   #=> nil
ruby-1.9.2-p180 :112 > Venue.find_by_latitude(ul.to_i)   #=> nil
ruby-1.9.2-p180 :113 > Venue.find_by_latitude(ul.to_s)   #=> nil
ruby-1.9.2-p180 :114 > ul   #=> "42.3471836"
ruby-1.9.2-p180 :115 > myl.class   #=> String
ruby-1.9.2-p180 :116 > ul.class   #=> String
ruby-1.9.2-p180 :117 > ll="42.3471836"   #=> "42.3471836"
ruby-1.9.2-p180 :118 > myl==ll   #=> false
ruby-1.9.2-p180 :119 > ul==ll   #=> true

任何建议都会很有帮助!目标是使用纬度和经度来识别已存储在我的数据库中的地点,因为地点的名称并不总是唯一的。

4

3 回答 3

2

两件事情:

据我了解,您将这些东西设想为数字,而不是字符串,因此最好在进行比较之前对其进行转换。

其次,由于字符串并不真正相等,但随着纬度的变化相当接近,所以我会冒昧地猜测你真的试图将它们与一些允许的误差范围进行比较。像这样(假设myLatitudeapiLatitude是数字):

(myLatitude - apiLatitude).abs < 0.000001

并且(当您使用它时)确保在比较它们时您的经度约定(-180 到 180 与 0 到 360)是一致的。

于 2011-08-17T18:12:07.120 回答
1

myl = "42.3471841" ul = "42.3471836" ll = "42.3471836"

当然 myl 不等于 ul(它们包含不同的字符串值),但是 ul 和 ll 是相等的(它们包含相同的字符串值)。我不明白你的问题是什么?您的代码显示了为什么 myl 不等于 ll

于 2011-08-17T17:53:30.857 回答
0

您可能会遇到问题,因为存储的值足够不同,以至于完全匹配不起作用。当您处理不同级别的精度时,这通常会发挥作用。

您可能希望切换到一个约定,其中所有值在保存之前都被强制为特定级别的精度。例如,在保存之前修复它们:

def set_precision
  self.latitude = '%.6f' % self.latitude.to_f
  self.longitude = '%.6f' % self.longitude.to_f
end

这会将值"42.72"转换"42.720000"为以及修剪过分精确的值。

搜索时,只需应用相同的格式。

于 2011-08-17T19:26:43.693 回答