更具体地说,如何进一步测试?我看到另一个帖子,答案使用了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
任何建议都会对您有所帮助!目标是使用纬度和经度来识别已经存储在我的数据库中的地方,因为地点的名称并不总是唯一的。
答案 0 :(得分:2)
两件事:
据我所知,你把这些东西想象成数字而不是字符串,所以最好在进行比较之前将它们转换成它。
其次,因为弦不是真的相等,但随着纬度的变化而相当接近,我会想出你想要将它们与一些允许的误差范围进行比较。像这样(假设myLatitude
和apiLatitude
是数字):
(myLatitude - apiLatitude).abs < 0.000001
并且(当你在它的时候)确保你在比较它们时经度约定(-180到180与0到360)是一致的。
答案 1 :(得分:1)
myl = "42.3471841"
ul = "42.3471836"
ll = "42.3471836"
当然myl不等于ul(它们包含不同的字符串值),但ul和ll相等(它们包含相同的字符串值)。我不明白你的问题是什么?您的代码显示了为什么myl不等于ll
答案 2 :(得分:0)
存储的值可能存在问题,但是完全匹配不起作用。当你处理不同程度的精确度时,这通常会发挥作用。
您可能希望切换到一种约定,其中所有值在保存之前都被强制为特定的精度级别。例如,在保存之前修复它们:
def set_precision
self.latitude = '%.6f' % self.latitude.to_f
self.longitude = '%.6f' % self.longitude.to_f
end
这会将"42.72"
等值转换为"42.720000"
,并修剪过于精确的值。
搜索时,只需应用相同的格式。